n,k=map(int,input().split())
#0-indexed
p=[i-1 for i in list(map(int,input().split()))]
c=list(map(int,input().split()))
#1回以上K回以下
ansF=-1000000000000000000
for i in range(n):
    #すでに辿ったもの
    check=[False]*n
    #辿った順番
    turns=[]
    #今
    now=i
    while check[now]==False:
        check[now]=True
        turns.append(now)
        now=p[now]
    #答え(今の)
    ans=0
    #kのうち何回分
    #更新を毎回行う
    spare=turns.index(now)
    if spare>=k:
        for j in range(k):
            ans+=c[turns[j]]
            ansF=max(ans,ansF)
        continue
    for j in range(spare):
        ans+=c[turns[j]]
        ansF=max(ans,ansF)
    turns=turns[spare:]
    spare=k-spare
    #サイクルの長さ
    l=len(turns)
    #サイクルの和(あまりも)
    #サイクルどこで止めるか
    x=0
    for j in range(l):
        x+=c[turns[j]]
    #そもそもサイクル回らない場合
    if spare<=l:
        for j in range(spare):
            ans+=c[turns[j]]
            ansF=max(ans,ansF)
        continue
    #サイクル回した方が良い場合もある
    #最後のサイクルは回さない方が良いパターンも
    if x>=0:
        ans+=(x*(spare//l-1))
        ansF=max(ans,ansF)
        for j in range(l):
            ans+=c[turns[j]]
            ansF=max(ans,ansF)
        for j in range(spare%l):
            ans+=c[turns[j]]
            ansF=max(ans,ansF)
    #サイクル回さない方がいい場合
    else:
        for j in range(l):
            ans+=c[turns[j]]
            ansF=max(ans,ansF)
print(ansF) n,k=map(int,input().split()) n map(int,input().split()) map int input().split() ().split () input split k i-1 for i in list(map(int,input().split())) for i in list(map(int,input().split())) i list(map(int,input().split())) list map(int,input().split()) map int input().split() ().split () input split for i in list(map(int,input().split())) i-1 i 1 p=[i-1 for i in list(map(int,input().split()))] p [i-1 for i in list(map(int,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 ansF=-1000000000000000000 ansF -1000000000000000000 for i in range(n):
    #すでに辿ったもの
    check=[False]*n
    #辿った順番
    turns=[]
    #今
    now=i
    while check[now]==False:
        check[now]=True
        turns.append(now)
        now=p[now]
    #答え(今の)
    ans=0
    #kのうち何回分
    #更新を毎回行う
    spare=turns.index(now)
    if spare>=k:
        for j in range(k):
            ans+=c[turns[j]]
            ansF=max(ans,ansF)
        continue
    for j in range(spare):
        ans+=c[turns[j]]
        ansF=max(ans,ansF)
    turns=turns[spare:]
    spare=k-spare
    #サイクルの長さ
    l=len(turns)
    #サイクルの和(あまりも)
    #サイクルどこで止めるか
    x=0
    for j in range(l):
        x+=c[turns[j]]
    #そもそもサイクル回らない場合
    if spare<=l:
        for j in range(spare):
            ans+=c[turns[j]]
            ansF=max(ans,ansF)
        continue
    #サイクル回した方が良い場合もある
    #最後のサイクルは回さない方が良いパターンも
    if x>=0:
        ans+=(x*(spare//l-1))
        ansF=max(ans,ansF)
        for j in range(l):
            ans+=c[turns[j]]
            ansF=max(ans,ansF)
        for j in range(spare%l):
            ans+=c[turns[j]]
            ansF=max(ans,ansF)
    #サイクル回さない方がいい場合
    else:
        for j in range(l):
            ans+=c[turns[j]]
            ansF=max(ans,ansF) i range(n) range n check=[False]*n check [False]*n [False] False n turns=[] turns [] now=i now i while check[now]==False:
        check[now]=True
        turns.append(now)
        now=p[now]
    #答え(今の)
     check[now]==False check[now] check now False check[now]=True check[now] check now True turns.append(now) turns.append turns append now now=p[now] now p[now] p now ans=0 ans 0 spare=turns.index(now) spare turns.index(now) turns.index turns index now if spare>=k:
        for j in range(k):
            ans+=c[turns[j]]
            ansF=max(ans,ansF)
        continue
     spare>=k spare k for j in range(k):
            ans+=c[turns[j]]
            ansF=max(ans,ansF)
         j range(k) range k ans+=c[turns[j]] ans c[turns[j]] c turns[j] turns j ansF=max(ans,ansF) ansF max(ans,ansF) max ans ansF continue for j in range(spare):
        ans+=c[turns[j]]
        ansF=max(ans,ansF)
     j range(spare) range spare ans+=c[turns[j]] ans c[turns[j]] c turns[j] turns j ansF=max(ans,ansF) ansF max(ans,ansF) max ans ansF turns=turns[spare:] turns turns[spare:] turns spare: spare spare=k-spare spare k-spare k spare l=len(turns) l len(turns) len turns x=0 x 0 for j in range(l):
        x+=c[turns[j]]
    #そもそもサイクル回らない場合
     j range(l) range l x+=c[turns[j]] x c[turns[j]] c turns[j] turns j if spare<=l:
        for j in range(spare):
            ans+=c[turns[j]]
            ansF=max(ans,ansF)
        continue
    #サイクル回した方が良い場合もある
    #最後のサイクルは回さない方が良いパターンも
     spare<=l spare l for j in range(spare):
            ans+=c[turns[j]]
            ansF=max(ans,ansF)
         j range(spare) range spare ans+=c[turns[j]] ans c[turns[j]] c turns[j] turns j ansF=max(ans,ansF) ansF max(ans,ansF) max ans ansF continue if x>=0:
        ans+=(x*(spare//l-1))
        ansF=max(ans,ansF)
        for j in range(l):
            ans+=c[turns[j]]
            ansF=max(ans,ansF)
        for j in range(spare%l):
            ans+=c[turns[j]]
            ansF=max(ans,ansF)
    #サイクル回さない方がいい場合
    else:
        for j in range(l):
            ans+=c[turns[j]]
            ansF=max(ans,ansF) x>=0 x 0 ans+=(x*(spare//l-1)) ans x*(spare//l-1) x spare//l-1 spare//l spare l 1 ansF=max(ans,ansF) ansF max(ans,ansF) max ans ansF for j in range(l):
            ans+=c[turns[j]]
            ansF=max(ans,ansF)
         j range(l) range l ans+=c[turns[j]] ans c[turns[j]] c turns[j] turns j ansF=max(ans,ansF) ansF max(ans,ansF) max ans ansF for j in range(spare%l):
            ans+=c[turns[j]]
            ansF=max(ans,ansF)
    #サイクル回さない方がいい場合
     j range(spare%l) range spare%l spare l ans+=c[turns[j]] ans c[turns[j]] c turns[j] turns j ansF=max(ans,ansF) ansF max(ans,ansF) max ans ansF for j in range(l):
            ans+=c[turns[j]]
            ansF=max(ans,ansF) j range(l) range l ans+=c[turns[j]] ans c[turns[j]] c turns[j] turns j ansF=max(ans,ansF) ansF max(ans,ansF) max ans ansF print(ansF) print ansF turns=turns[spare:] turns[spare:] turns ans=0 0 ans ansF=max(ans,ansF) max(ans,ansF) ansF ans+=c[turns[j]] c[turns[j]] ans ansF=max(ans,ansF) max(ans,ansF) ansF check=[False]*n [False]*n check ans+=c[turns[j]] c[turns[j]] ans spare=turns.index(now) turns.index(now) spare ansF=max(ans,ansF) max(ans,ansF) ansF ansF=max(ans,ansF) max(ans,ansF) ansF turns=[] [] turns ansF=-1000000000000000000 -1000000000000000000 ansF c=list(map(int,input().split())) list(map(int,input().split())) c x+=c[turns[j]] c[turns[j]] x n,k=map(int,input().split()) map(int,input().split()) n k=map(int,input().split()) map(int,input().split()) k x=0 0 x now=p[now] p[now] now spare=k-spare k-spare spare ansF=max(ans,ansF) max(ans,ansF) ansF ans+=c[turns[j]] c[turns[j]] ans ansF=max(ans,ansF) max(ans,ansF) ansF ans+=c[turns[j]] c[turns[j]] ans now=i i now ans+=(x*(spare//l-1)) x*(spare//l-1) ans ans+=c[turns[j]] c[turns[j]] ans ansF=max(ans,ansF) max(ans,ansF) ansF ans+=c[turns[j]] c[turns[j]] ans p=[i-1 for i in list(map(int,input().split()))] [i-1 for i in list(map(int,input().split()))] p l=len(turns) len(turns) l
n,k=map(int,input().split())
#0-indexed
p=[i-1 for i in list(map(int,input().split()))]
c=list(map(int,input().split()))
#1回以上K回以下
ansF=-1000000000000000000
for i in range(n):
    #すでに辿ったもの
    check=[False]*n
    #辿った順番
    turns=[]
    #今
    now=i
    while check[now]==False:
        check[now]=True
        turns.append(now)
        now=p[now]
    #答え(今の)
    ans=0
    #kのうち何回分
    #更新を毎回行う
    spare=turns.index(now)
    if spare>=k:
        for j in range(k):
            ans+=c[turns[j]]
            ansF=max(ans,ansF)
        continue
    for j in range(spare):
        ans+=c[turns[j]]
        ansF=max(ans,ansF)
    turns=turns[spare:]
    spare=k-spare
    #サイクルの長さ
    l=len(turns)
    #サイクルの和(あまりも)
    #サイクルどこで止めるか
    x=0
    for j in range(l):
        x+=c[turns[j]]
    #そもそもサイクル回らない場合
    if spare<=l:
        for j in range(spare):
            ans+=c[turns[j]]
            ansF=max(ans,ansF)
        continue
    #サイクル回した方が良い場合もある
    #最後のサイクルは回さない方が良いパターンも
    if x>=0:
        ans+=(x*(spare//l-1))
        ansF=max(ans,ansF)
        for j in range(l):
            ans+=c[turns[j]]
            ansF=max(ans,ansF)
        for j in range(spare%l):
            ans+=c[turns[j]]
            ansF=max(ans,ansF)
    #サイクル回さない方がいい場合
    else:
        for j in range(l):
            ans+=c[turns[j]]
            ansF=max(ans,ansF)
print(ansF)
