from numba import jit
@jit
def main():
  n,k=map(int,input().split(" "))
  p=list(map(int,input().split(" ")))
  c=list(map(int,input().split(" ")))
  ans=-10**18
  for i in range(n):
    start,count=i,1
    val=c[start]
    while p[start]-1!=i: #ループ部分. iに戻る直前まで続ける.
      start=p[start]-1
      count+=1
      val+=c[start]
    start=i
    # この時点でvalは1ループのスコア合計, カウントは1ループのsizeになっている
    '''
    以下の基本的な方針は
    - 1ループ分のスコア合計が正であればできるだけループしてスコアを稼ぎ、残りの余りの分の最大をとる。
    - 1ループ分のスコア合計が負であればループ回数を0にして、1ループ以内で最大となる移動を求める。
    しかし、ループ回数が最大であればいいとは限らない。
    x回ループできたとしてcount%k回の余りの分を調べても、x-1回ループし次の1回のループのなかで1周仕切らない移動が最大になる可能性がある。
    なのでx-1回分のループだけ取り切ってしまい、残りcount+k%count(＝「1周半」)の中で最大を調べる必要がある。
    また、負の場合は基本的に1周以内だが、kが極端に小さいときの処理が必要。
    '''
    if val>0:
      a=(k//count-1)*val  # 最後に余りのk%count回ぶんだけでなく1周半ぶんは試したいので(ループ余りではk%count回しか移動できないわけではない)
      ans=max(a,ans)
      num=count+k%count
    else:
      a=0
      num=min(k,count)  # 1周以内におさめたい. k<countという非常に限られた場合のみk回までの移動になることを考慮。
    for _ in range(num):
      start=p[start]-1
      a+=c[start]
      ans=max(a,ans)
  print(ans)
main() from numba import jit def main():
  n,k=map(int,input().split(" "))
  p=list(map(int,input().split(" ")))
  c=list(map(int,input().split(" ")))
  ans=-10**18
  for i in range(n):
    start,count=i,1
    val=c[start]
    while p[start]-1!=i: #ループ部分. iに戻る直前まで続ける.
      start=p[start]-1
      count+=1
      val+=c[start]
    start=i
    # この時点でvalは1ループのスコア合計, カウントは1ループのsizeになっている
    '''
    以下の基本的な方針は
    - 1ループ分のスコア合計が正であればできるだけループしてスコアを稼ぎ、残りの余りの分の最大をとる。
    - 1ループ分のスコア合計が負であればループ回数を0にして、1ループ以内で最大となる移動を求める。
    しかし、ループ回数が最大であればいいとは限らない。
    x回ループできたとしてcount%k回の余りの分を調べても、x-1回ループし次の1回のループのなかで1周仕切らない移動が最大になる可能性がある。
    なのでx-1回分のループだけ取り切ってしまい、残りcount+k%count(＝「1周半」)の中で最大を調べる必要がある。
    また、負の場合は基本的に1周以内だが、kが極端に小さいときの処理が必要。
    '''
    if val>0:
      a=(k//count-1)*val  # 最後に余りのk%count回ぶんだけでなく1周半ぶんは試したいので(ループ余りではk%count回しか移動できないわけではない)
      ans=max(a,ans)
      num=count+k%count
    else:
      a=0
      num=min(k,count)  # 1周以内におさめたい. k<countという非常に限られた場合のみk回までの移動になることを考慮。
    for _ in range(num):
      start=p[start]-1
      a+=c[start]
      ans=max(a,ans)
  print(ans) main n,k=map(int,input().split(" ")) n map(int,input().split(" ")) map int input().split(" ") ().split () input split " " k p=list(map(int,input().split(" "))) p list(map(int,input().split(" "))) list map(int,input().split(" ")) map int input().split(" ") ().split () input split " " c=list(map(int,input().split(" "))) c list(map(int,input().split(" "))) list map(int,input().split(" ")) map int input().split(" ") ().split () input split " " ans=-10**18 ans -10**18 -10 18 for i in range(n):
    start,count=i,1
    val=c[start]
    while p[start]-1!=i: #ループ部分. iに戻る直前まで続ける.
      start=p[start]-1
      count+=1
      val+=c[start]
    start=i
    # この時点でvalは1ループのスコア合計, カウントは1ループのsizeになっている
    '''
    以下の基本的な方針は
    - 1ループ分のスコア合計が正であればできるだけループしてスコアを稼ぎ、残りの余りの分の最大をとる。
    - 1ループ分のスコア合計が負であればループ回数を0にして、1ループ以内で最大となる移動を求める。
    しかし、ループ回数が最大であればいいとは限らない。
    x回ループできたとしてcount%k回の余りの分を調べても、x-1回ループし次の1回のループのなかで1周仕切らない移動が最大になる可能性がある。
    なのでx-1回分のループだけ取り切ってしまい、残りcount+k%count(＝「1周半」)の中で最大を調べる必要がある。
    また、負の場合は基本的に1周以内だが、kが極端に小さいときの処理が必要。
    '''
    if val>0:
      a=(k//count-1)*val  # 最後に余りのk%count回ぶんだけでなく1周半ぶんは試したいので(ループ余りではk%count回しか移動できないわけではない)
      ans=max(a,ans)
      num=count+k%count
    else:
      a=0
      num=min(k,count)  # 1周以内におさめたい. k<countという非常に限られた場合のみk回までの移動になることを考慮。
    for _ in range(num):
      start=p[start]-1
      a+=c[start]
      ans=max(a,ans)
   i range(n) range n start,count=i,1 start i count 1 val=c[start] val c[start] c start while p[start]-1!=i: #ループ部分. iに戻る直前まで続ける.
      start=p[start]-1
      count+=1
      val+=c[start]
     p[start]-1!=i p[start]-1 p[start] p start 1 i start=p[start]-1 start p[start]-1 p[start] p start 1 count+=1 count 1 val+=c[start] val c[start] c start start=i start i '''
    以下の基本的な方針は
    - 1ループ分のスコア合計が正であればできるだけループしてスコアを稼ぎ、残りの余りの分の最大をとる。
    - 1ループ分のスコア合計が負であればループ回数を0にして、1ループ以内で最大となる移動を求める。
    しかし、ループ回数が最大であればいいとは限らない。
    x回ループできたとしてcount%k回の余りの分を調べても、x-1回ループし次の1回のループのなかで1周仕切らない移動が最大になる可能性がある。
    なのでx-1回分のループだけ取り切ってしまい、残りcount+k%count(＝「1周半」)の中で最大を調べる必要がある。
    また、負の場合は基本的に1周以内だが、kが極端に小さいときの処理が必要。
    ''' if val>0:
      a=(k//count-1)*val  # 最後に余りのk%count回ぶんだけでなく1周半ぶんは試したいので(ループ余りではk%count回しか移動できないわけではない)
      ans=max(a,ans)
      num=count+k%count
    else:
      a=0
      num=min(k,count)  # 1周以内におさめたい. k<countという非常に限られた場合のみk回までの移動になることを考慮。
     val>0 val 0 a=(k//count-1)*val a (k//count-1)*val k//count-1 k//count k count 1 val ans=max(a,ans) ans max(a,ans) max a ans num=count+k%count num count+k%count count k%count k count a=0 a 0 num=min(k,count) num min(k,count) min k count for _ in range(num):
      start=p[start]-1
      a+=c[start]
      ans=max(a,ans)
   _ range(num) range num start=p[start]-1 start p[start]-1 p[start] p start 1 a+=c[start] a c[start] c start ans=max(a,ans) ans max(a,ans) max a ans print(ans) print ans @jit main jit main main() main def main():
  n,k=map(int,input().split(" "))
  p=list(map(int,input().split(" ")))
  c=list(map(int,input().split(" ")))
  ans=-10**18
  for i in range(n):
    start,count=i,1
    val=c[start]
    while p[start]-1!=i: #ループ部分. iに戻る直前まで続ける.
      start=p[start]-1
      count+=1
      val+=c[start]
    start=i
    # この時点でvalは1ループのスコア合計, カウントは1ループのsizeになっている
    '''
    以下の基本的な方針は
    - 1ループ分のスコア合計が正であればできるだけループしてスコアを稼ぎ、残りの余りの分の最大をとる。
    - 1ループ分のスコア合計が負であればループ回数を0にして、1ループ以内で最大となる移動を求める。
    しかし、ループ回数が最大であればいいとは限らない。
    x回ループできたとしてcount%k回の余りの分を調べても、x-1回ループし次の1回のループのなかで1周仕切らない移動が最大になる可能性がある。
    なのでx-1回分のループだけ取り切ってしまい、残りcount+k%count(＝「1周半」)の中で最大を調べる必要がある。
    また、負の場合は基本的に1周以内だが、kが極端に小さいときの処理が必要。
    '''
    if val>0:
      a=(k//count-1)*val  # 最後に余りのk%count回ぶんだけでなく1周半ぶんは試したいので(ループ余りではk%count回しか移動できないわけではない)
      ans=max(a,ans)
      num=count+k%count
    else:
      a=0
      num=min(k,count)  # 1周以内におさめたい. k<countという非常に限られた場合のみk回までの移動になることを考慮。
    for _ in range(num):
      start=p[start]-1
      a+=c[start]
      ans=max(a,ans)
  print(ans) def main():
  n,k=map(int,input().split(" "))
  p=list(map(int,input().split(" ")))
  c=list(map(int,input().split(" ")))
  ans=-10**18
  for i in range(n):
    start,count=i,1
    val=c[start]
    while p[start]-1!=i: #ループ部分. iに戻る直前まで続ける.
      start=p[start]-1
      count+=1
      val+=c[start]
    start=i
    # この時点でvalは1ループのスコア合計, カウントは1ループのsizeになっている
    '''
    以下の基本的な方針は
    - 1ループ分のスコア合計が正であればできるだけループしてスコアを稼ぎ、残りの余りの分の最大をとる。
    - 1ループ分のスコア合計が負であればループ回数を0にして、1ループ以内で最大となる移動を求める。
    しかし、ループ回数が最大であればいいとは限らない。
    x回ループできたとしてcount%k回の余りの分を調べても、x-1回ループし次の1回のループのなかで1周仕切らない移動が最大になる可能性がある。
    なのでx-1回分のループだけ取り切ってしまい、残りcount+k%count(＝「1周半」)の中で最大を調べる必要がある。
    また、負の場合は基本的に1周以内だが、kが極端に小さいときの処理が必要。
    '''
    if val>0:
      a=(k//count-1)*val  # 最後に余りのk%count回ぶんだけでなく1周半ぶんは試したいので(ループ余りではk%count回しか移動できないわけではない)
      ans=max(a,ans)
      num=count+k%count
    else:
      a=0
      num=min(k,count)  # 1周以内におさめたい. k<countという非常に限られた場合のみk回までの移動になることを考慮。
    for _ in range(num):
      start=p[start]-1
      a+=c[start]
      ans=max(a,ans)
  print(ans) main
from numba import jit
@jit
def main():
  n,k=map(int,input().split(" "))
  p=list(map(int,input().split(" ")))
  c=list(map(int,input().split(" ")))
  ans=-10**18
  for i in range(n):
    start,count=i,1
    val=c[start]
    while p[start]-1!=i: #ループ部分. iに戻る直前まで続ける.
      start=p[start]-1
      count+=1
      val+=c[start]
    start=i
    # この時点でvalは1ループのスコア合計, カウントは1ループのsizeになっている
    '''
    以下の基本的な方針は
    - 1ループ分のスコア合計が正であればできるだけループしてスコアを稼ぎ、残りの余りの分の最大をとる。
    - 1ループ分のスコア合計が負であればループ回数を0にして、1ループ以内で最大となる移動を求める。
    しかし、ループ回数が最大であればいいとは限らない。
    x回ループできたとしてcount%k回の余りの分を調べても、x-1回ループし次の1回のループのなかで1周仕切らない移動が最大になる可能性がある。
    なのでx-1回分のループだけ取り切ってしまい、残りcount+k%count(＝「1周半」)の中で最大を調べる必要がある。
    また、負の場合は基本的に1周以内だが、kが極端に小さいときの処理が必要。
    '''
    if val>0:
      a=(k//count-1)*val  # 最後に余りのk%count回ぶんだけでなく1周半ぶんは試したいので(ループ余りではk%count回しか移動できないわけではない)
      ans=max(a,ans)
      num=count+k%count
    else:
      a=0
      num=min(k,count)  # 1周以内におさめたい. k<countという非常に限られた場合のみk回までの移動になることを考慮。
    for _ in range(num):
      start=p[start]-1
      a+=c[start]
      ans=max(a,ans)
  print(ans)
main()
