n,k=[int(x) for x in input().split()]
p=[int(x)-1 for x in input().split()]
c=[int(x) for x in input().split()]

ans=max(c)
if ans<0:
    print(ans)
    exit()

for i in range(n):
    #最後に自分という順番
    nxt=i
    lp=[]
    while 1:
        nxt=p[nxt]
        lp.append(nxt)
        if nxt==i:
            break
    lpc=max(0,sum(c[x] for x in lp))
    nxt=i
    lpl=len(lp)
    wks=0
    #ループ内の最大値を見る
    for j in range(lpl):
        nxt=p[nxt]
        wks+=c[nxt]
        #ループ内の距離をkから引いた数でループ長を割ることによって
        #剰余部分を加算するパータンと、剰余に突入する1つ前のループの途中でやめた
        #パターンの両方を確認できる
        #ループが負になる場合も考えて,この部分のみ加算するパターンも考える
        #このループはkを超えないので安全
        ans=max(ans,(k-j-1)//lpl*lpc+wks,wks)
        #ループの長さがkを超える場合打ち切る
        if j==k-1:
            break
print(ans) int(x) for x in input().split() for x in input().split() x input().split() ().split () input split for x in input().split() int(x) int x n,k=[int(x) for x in input().split()] n [int(x) for x in input().split()] k int(x)-1 for x in input().split() for x in input().split() x input().split() ().split () input split for x in input().split() int(x)-1 int(x) int x 1 p=[int(x)-1 for x in input().split()] p [int(x)-1 for x in input().split()] int(x) for x in input().split() for x in input().split() x input().split() ().split () input split for x in input().split() int(x) int x c=[int(x) for x in input().split()] c [int(x) for x in input().split()] ans=max(c) ans max(c) max c if ans<0:
    print(ans)
    exit() ans<0 ans 0 print(ans) print ans exit() exit for i in range(n):
    #最後に自分という順番
    nxt=i
    lp=[]
    while 1:
        nxt=p[nxt]
        lp.append(nxt)
        if nxt==i:
            break
    lpc=max(0,sum(c[x] for x in lp))
    nxt=i
    lpl=len(lp)
    wks=0
    #ループ内の最大値を見る
    for j in range(lpl):
        nxt=p[nxt]
        wks+=c[nxt]
        #ループ内の距離をkから引いた数でループ長を割ることによって
        #剰余部分を加算するパータンと、剰余に突入する1つ前のループの途中でやめた
        #パターンの両方を確認できる
        #ループが負になる場合も考えて,この部分のみ加算するパターンも考える
        #このループはkを超えないので安全
        ans=max(ans,(k-j-1)//lpl*lpc+wks,wks)
        #ループの長さがkを超える場合打ち切る
        if j==k-1:
            break i range(n) range n nxt=i nxt i lp=[] lp [] while 1:
        nxt=p[nxt]
        lp.append(nxt)
        if nxt==i:
            break
     1 nxt=p[nxt] nxt p[nxt] p nxt lp.append(nxt) lp.append lp append nxt if nxt==i:
            break
     nxt==i nxt i break lpc=max(0,sum(c[x] for x in lp)) lpc max(0,sum(c[x] for x in lp)) max 0 sum(c[x] for x in lp) sum c[x] c x nxt=i nxt i lpl=len(lp) lpl len(lp) len lp wks=0 wks 0 for j in range(lpl):
        nxt=p[nxt]
        wks+=c[nxt]
        #ループ内の距離をkから引いた数でループ長を割ることによって
        #剰余部分を加算するパータンと、剰余に突入する1つ前のループの途中でやめた
        #パターンの両方を確認できる
        #ループが負になる場合も考えて,この部分のみ加算するパターンも考える
        #このループはkを超えないので安全
        ans=max(ans,(k-j-1)//lpl*lpc+wks,wks)
        #ループの長さがkを超える場合打ち切る
        if j==k-1:
            break j range(lpl) range lpl nxt=p[nxt] nxt p[nxt] p nxt wks+=c[nxt] wks c[nxt] c nxt ans=max(ans,(k-j-1)//lpl*lpc+wks,wks) ans max(ans,(k-j-1)//lpl*lpc+wks,wks) max ans (k-j-1)//lpl*lpc+wks (k-j-1)//lpl*lpc (k-j-1)//lpl k-j-1 k-j k j 1 lpl lpc wks wks if j==k-1:
            break j==k-1 j k-1 k 1 break print(ans) print ans k=[int(x) for x in input().split()] [int(x) for x in input().split()] k lpl=len(lp) len(lp) lpl ans=max(c) max(c) ans nxt=p[nxt] p[nxt] nxt lpc=max(0,sum(c[x] for x in lp)) max(0,sum(c[x] for x in lp)) lpc c=[int(x) for x in input().split()] [int(x) for x in input().split()] c n,k=[int(x) for x in input().split()] [int(x) for x in input().split()] n nxt=p[nxt] p[nxt] nxt wks+=c[nxt] c[nxt] wks p=[int(x)-1 for x in input().split()] [int(x)-1 for x in input().split()] p nxt=i i nxt wks=0 0 wks ans=max(ans,(k-j-1)//lpl*lpc+wks,wks) max(ans,(k-j-1)//lpl*lpc+wks,wks) ans nxt=i i nxt lp=[] [] lp
n,k=[int(x) for x in input().split()]
p=[int(x)-1 for x in input().split()]
c=[int(x) for x in input().split()]

ans=max(c)
if ans<0:
    print(ans)
    exit()

for i in range(n):
    #最後に自分という順番
    nxt=i
    lp=[]
    while 1:
        nxt=p[nxt]
        lp.append(nxt)
        if nxt==i:
            break
    lpc=max(0,sum(c[x] for x in lp))
    nxt=i
    lpl=len(lp)
    wks=0
    #ループ内の最大値を見る
    for j in range(lpl):
        nxt=p[nxt]
        wks+=c[nxt]
        #ループ内の距離をkから引いた数でループ長を割ることによって
        #剰余部分を加算するパータンと、剰余に突入する1つ前のループの途中でやめた
        #パターンの両方を確認できる
        #ループが負になる場合も考えて,この部分のみ加算するパターンも考える
        #このループはkを超えないので安全
        ans=max(ans,(k-j-1)//lpl*lpc+wks,wks)
        #ループの長さがkを超える場合打ち切る
        if j==k-1:
            break
print(ans)
