N, K = map(int,input().split())
P = list(map(int,input().split()))
C = list(map(int,input().split()))
S = []
R = -1000000001
#それぞれについての累積和の計算
for i in range(N):#このループはN個の初期マスの時のループ
    t = i  # tは現在の位置
    cnt = 0  # 累積和
    sum = []  # 累積和のリスト
    res = 0
    while True:#このループは一つの初期マスの累積和。最初のコマに戻るまで
        t = P[t]-1
        cnt += C[t]
        sum.append(cnt)
        if t == i:
            break
    #S.append(sum)
    if len(sum) >=  K:
        res = max(sum[:K])
    else:
        if sum[-1] <= 0:
            res = max(sum)
        else:
            score1 = sum[-1] * (K // len(sum) - 1) + max(sum)
            score2 = sum[-1] * (K // len(sum))
            r = K % len(sum)
            if r != 0:
                score2 += max(0, max(sum[:r]))
            res = max(score1,score2)
    R = max(R,res)
print(R) 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 S = [] S [] R = -1000000001 R -1000000001 for i in range(N):#このループはN個の初期マスの時のループ
    t = i  # tは現在の位置
    cnt = 0  # 累積和
    sum = []  # 累積和のリスト
    res = 0
    while True:#このループは一つの初期マスの累積和。最初のコマに戻るまで
        t = P[t]-1
        cnt += C[t]
        sum.append(cnt)
        if t == i:
            break
    #S.append(sum)
    if len(sum) >=  K:
        res = max(sum[:K])
    else:
        if sum[-1] <= 0:
            res = max(sum)
        else:
            score1 = sum[-1] * (K // len(sum) - 1) + max(sum)
            score2 = sum[-1] * (K // len(sum))
            r = K % len(sum)
            if r != 0:
                score2 += max(0, max(sum[:r]))
            res = max(score1,score2)
    R = max(R,res) i range(N) range N t = i t i cnt = 0 cnt 0 sum = [] sum [] res = 0 res 0 while True:#このループは一つの初期マスの累積和。最初のコマに戻るまで
        t = P[t]-1
        cnt += C[t]
        sum.append(cnt)
        if t == i:
            break
    #S.append(sum)
     True t = P[t]-1 t P[t]-1 P[t] P t 1 cnt += C[t] cnt C[t] C t sum.append(cnt) sum.append sum append cnt if t == i:
            break
    #S.append(sum)
     t == i t i break if len(sum) >=  K:
        res = max(sum[:K])
    else:
        if sum[-1] <= 0:
            res = max(sum)
        else:
            score1 = sum[-1] * (K // len(sum) - 1) + max(sum)
            score2 = sum[-1] * (K // len(sum))
            r = K % len(sum)
            if r != 0:
                score2 += max(0, max(sum[:r]))
            res = max(score1,score2)
     len(sum) >=  K len(sum) len sum K res = max(sum[:K]) res max(sum[:K]) max sum[:K] sum :K K if sum[-1] <= 0:
            res = max(sum)
        else:
            score1 = sum[-1] * (K // len(sum) - 1) + max(sum)
            score2 = sum[-1] * (K // len(sum))
            r = K % len(sum)
            if r != 0:
                score2 += max(0, max(sum[:r]))
            res = max(score1,score2)
     sum[-1] <= 0 sum[-1] sum -1 0 res = max(sum) res max(sum) max sum score1 = sum[-1] * (K // len(sum) - 1) + max(sum) score1 sum[-1] * (K // len(sum) - 1) + max(sum) sum[-1] * (K // len(sum) - 1) sum[-1] sum -1 K // len(sum) - 1 K // len(sum) K len(sum) len sum 1 max(sum) max sum score2 = sum[-1] * (K // len(sum)) score2 sum[-1] * (K // len(sum)) sum[-1] sum -1 K // len(sum) K len(sum) len sum r = K % len(sum) r K % len(sum) K len(sum) len sum if r != 0:
                score2 += max(0, max(sum[:r]))
             r != 0 r 0 score2 += max(0, max(sum[:r])) score2 max(0, max(sum[:r])) max 0 max(sum[:r]) max sum[:r] sum :r r res = max(score1,score2) res max(score1,score2) max score1 score2 R = max(R,res) R max(R,res) max R res print(R) print R K = map(int,input().split()) map(int,input().split()) K res = max(sum[:K]) max(sum[:K]) res cnt = 0 0 cnt P = list(map(int,input().split())) list(map(int,input().split())) P sum = [] [] sum t = P[t]-1 P[t]-1 t R = -1000000001 -1000000001 R res = max(sum) max(sum) res r = K % len(sum) K % len(sum) r S = [] [] S C = list(map(int,input().split())) list(map(int,input().split())) C cnt += C[t] C[t] cnt N, K = map(int,input().split()) map(int,input().split()) N score1 = sum[-1] * (K // len(sum) - 1) + max(sum) sum[-1] * (K // len(sum) - 1) + max(sum) score1 score2 += max(0, max(sum[:r])) max(0, max(sum[:r])) score2 t = i i t score2 = sum[-1] * (K // len(sum)) sum[-1] * (K // len(sum)) score2 res = 0 0 res R = max(R,res) max(R,res) R res = max(score1,score2) max(score1,score2) res
N, K = map(int,input().split())
P = list(map(int,input().split()))
C = list(map(int,input().split()))
S = []
R = -1000000001
#それぞれについての累積和の計算
for i in range(N):#このループはN個の初期マスの時のループ
    t = i  # tは現在の位置
    cnt = 0  # 累積和
    sum = []  # 累積和のリスト
    res = 0
    while True:#このループは一つの初期マスの累積和。最初のコマに戻るまで
        t = P[t]-1
        cnt += C[t]
        sum.append(cnt)
        if t == i:
            break
    #S.append(sum)
    if len(sum) >=  K:
        res = max(sum[:K])
    else:
        if sum[-1] <= 0:
            res = max(sum)
        else:
            score1 = sum[-1] * (K // len(sum) - 1) + max(sum)
            score2 = sum[-1] * (K // len(sum))
            r = K % len(sum)
            if r != 0:
                score2 += max(0, max(sum[:r]))
            res = max(score1,score2)
    R = max(R,res)
print(R)
