require "set"
n,k = gets.chomp.split(" ").map(&:to_i)
p_arr = gets.chomp.split(" ").map(&:to_i)
c_arr = gets.chomp.split(" ").map(&:to_i)

# 添字調整
p_arr.unshift(0)
c_arr.unshift(0)

cycle_arr = []

set = Set.new
# 閉路がいくつかあるのでそれを求める
(1..n).each do |i|
  start_index = i
  # 重複してたどるのを避ける
  next if set.include?(start_index)
  index = start_index
  in_cycle_arr = []
  sum = 0
  while true do
    # 問題文では移動先のスコアを計上するとあるが, 対象のグラフは閉路なので移動元のスコアで計上しても大丈夫
    score = c_arr[index]
    in_cycle_arr << score
    sum += score
    # 通った印づけ
    set << index
    # 次のindex
    index = p_arr[index]
    # ループ判定
    break if index == start_index
  end
  cycle_arr << [in_cycle_arr, sum]
end

# 負の無限大(c_iの最小値で良い)
max = (10 ** 9) * (-1)

# 各閉路の各indexで試す
cycle_arr.each do |(cycle, sum)|
  cycle.each_with_index do |c, i|
    c_length = cycle.length
    # sumが正ならなるべく繰り返した方がお得, 負なら繰り返さないほうがお得(0はどっちでもOK)
    if sum > 0
      loop_num = k / c_length
      r = k % c_length 
#      if r == 0
        loop_num -= 1
        r += c_length
#      end
      in_sum = sum * loop_num
      max = in_sum if in_sum > max
      t = r
    else
      in_sum = 0
      t = c_length
    end
    t.times do |j|
      in_sum += cycle[(i + j) % c_length]
      max = in_sum if in_sum > max
    end
  end
end

puts max
