def max(a,b); a > b ? a : b; end
def min(a,b); a < b ? a : b; end

def extract_cycle(s, used)
  cycle = []
  u = s
  until used[u]
    used[u] = true
    cycle << u  
    u = P[u]
  end
  return cycle
end

N, K = gets.split.map(&:to_i)
P = gets.split.map(&:to_i).tap{|array| array.unshift(0) }
C = gets.split.map(&:to_i).tap{|array| array.unshift(0) }

used = Array.new(N + 1)

ans = (1 .. N).inject(-1e20) do |max_score, s|
  next max_score if used[s]
  # sを始点とする閉路を抽出
  cycle = extract_cycle(s, used)
  z = cycle.size
  
  # 閉路の各頂点から最大1周分のスコアを計算できるように事前準備
  dp = Array.new(3 * z + 1, 0)
  (1 .. z * 3).each do |i|
    v = cycle[i % z]
    dp[i] = dp[i - 1] + C[v]
  end

  # 閉路上の任意の点 s を始点としたときの最大スコアを計算
  # 1周 + 余りの最大スコアを計算する
  # 余りのみ計算すると1周が負(sz < 0)かつ, K >= zのときに
  # 上手く計算できないので、z + K % zになってる。
  
  sz = max(0, dp[z])
  k = min(K, z + K % z)
  r = (K - k) / z

  cycle_score = (0 ... z).map{|s| r * sz + score[s + 1, k].max - score[s]}.max

  max(max_score, cycle_score)
end
puts ans
