N,K = list(map(int,input().split()))



P = list(map(int,input().split()))



C = list(map(int,input().split()))



ans = -10000000000



if K <= N:

    for i in range(N):

        count = 0

        tmp_point = 0

        nv = i

        while count < K:

            nvv = P[nv]

            nvv -= 1

            tmp_point += C[nvv]

            count += 1

            nv = nvv

            ans = max(ans, tmp_point)

    print(ans)

else:

    loop = [0]*N

    for i in range(N):

        count = 0

        check = [False]*N

        tmp_point = 0

        nv = i

        while True:

            nvv = P[nv]

            nvv -= 1

            if check[nvv] == True:

                break

            check[nvv] = True

            tmp_point += C[nvv]

            count += 1

            nv = nvv

            ans = max(ans, tmp_point)

        loop[i] = [tmp_point, count, i]

    loop.sort(reverse=True)

    #print(loop)

    new_ans = -10000000

    for value, counter, key in loop:

        if value < 0:

            break

        shou = K//counter-1

        amari = K%counter+counter

        tmp_ans = value*shou

        new_ans = max(new_ans, tmp_ans)

        count = 0

        nv = key

        while count < amari:

            nvv = P[nv]

            nvv -= 1

            tmp_ans += C[nvv]

            count += 1

            nv = nvv

            new_ans = max(new_ans, tmp_ans)



        

    print((max(loop[0][0], ans, new_ans)))



#ブログの模範解答（参考のため提出）

#https://marco-note.net/abc-175-work-log/



N, K = list(map(int, input().split()))

P = list(map(int, input().split()))

C = list(map(int, input().split()))



ans = -float('inf')

for s in range(N):

    ### Step1

    S = []  # 累積和S. ただし, 初項は0ではなく1回目の移動後の得点とする.

    # 1回目の移動

    i = P[s] - 1

    S.append(C[i])

    # 2回目以降の移動. スタート地点に戻ってくるまで繰り返し.

    while i != s:

        i = P[i] - 1

        S.append(S[-1] + C[i])



    ### Step2: KとSの長に応じて場合分けして, 得点の最大値を求める.

    # 1周未満しか移動できない場合:

    if K <= len(S):

        score = max(S[:K])

    # 1周以上回ることができるが, ループを1周したときに得点が減る場合:

    elif S[-1] <= 0:

        score = max(S)

    # 1週以上回ることができ, かつループを1週するごとに得点が増える場合:

    else:

        # ループを (K // len(S) - 1)回 廻る場合:

        score1 = S[-1] * (K // len(S) - 1)

        score1 += max(S)

        # ループを (K // len(S))回 廻る場合:

        score2 = S[-1] * (K // len(S))

        r = K % len(S)

        if r != 0:

            score2 += max(0, max(S[:r]))

        # score1 と score2 の大きい方がこの場合の得点の最大値

        score = max(score1, score2)



    ans = max(ans, score)



print(ans)

N, K = list(map(int, input().split()))
P = list(map(int, input().split()))
C = list(map(int, input().split()))
ans = -10000000000
if K <= N:
    for i in range(N):
        count = 0
        tmp_point = 0
        nv = i
        while count < K:
            nvv = P[nv]
            nvv -= 1
            tmp_point += C[nvv]
            count += 1
            nv = nvv
            ans = max(ans, tmp_point)
    print(ans)
else:
    loop = [0] * N
    for i in range(N):
        count = 0
        check = [False] * N
        tmp_point = 0
        nv = i
        while True:
            nvv = P[nv]
            nvv -= 1
            if check[nvv] == True:
                break
            check[nvv] = True
            tmp_point += C[nvv]
            count += 1
            nv = nvv
            ans = max(ans, tmp_point)
        loop[i] = [tmp_point, count, i]
    loop.sort(reverse=True)
    # print(loop)
    new_ans = -10000000
    for value, counter, key in loop:
        if value < 0:
            break
        shou = K // counter - 1
        amari = K % counter + counter
        tmp_ans = value * shou
        new_ans = max(new_ans, tmp_ans)
        count = 0
        nv = key
        while count < amari:
            nvv = P[nv]
            nvv -= 1
            tmp_ans += C[nvv]
            count += 1
            nv = nvv
            new_ans = max(new_ans, tmp_ans)
    print((max(loop[0][0], ans, new_ans)))

# ブログの模範解答（参考のため提出）
# https://marco-note.net/abc-175-work-log/
N, K = list(map(int, input().split()))
P = list(map(int, input().split()))
C = list(map(int, input().split()))
ans = -float("inf")
for s in range(N):
    ### Step1
    S = []  # 累積和S. ただし, 初項は0ではなく1回目の移動後の得点とする.
    # 1回目の移動
    i = P[s] - 1
    S.append(C[i])
    # 2回目以降の移動. スタート地点に戻ってくるまで繰り返し.
    while i != s:
        i = P[i] - 1
        S.append(S[-1] + C[i])
    ### Step2: KとSの長に応じて場合分けして, 得点の最大値を求める.
    # 1周未満しか移動できない場合:
    if K <= len(S):
        score = max(S[:K])
    # 1周以上回ることができるが, ループを1周したときに得点が減る場合:
    elif S[-1] <= 0:
        score = max(S)
    # 1週以上回ることができ, かつループを1週するごとに得点が増える場合:
    else:
        # ループを (K // len(S) - 1)回 廻る場合:
        score1 = S[-1] * (K // len(S) - 1)
        score1 += max(S)
        # ループを (K // len(S))回 廻る場合:
        score2 = S[-1] * (K // len(S))
        r = K % len(S)
        if r != 0:
            score2 += max(0, max(S[:r]))
        # score1 と score2 の大きい方がこの場合の得点の最大値
        score = max(score1, score2)
    ans = max(ans, score)
print(ans)

+# ブログの模範解答（参考のため提出） +# https://marco-note.net/abc-175-work-log/ -ans = -10000000000 -if K <= N: -    for i in range(N): -        count = 0 -        tmp_point = 0 -        nv = i -        while count < K: -            nvv = P[nv] -            nvv -= 1 -            tmp_point += C[nvv] -            count += 1 -            nv = nvv -            ans = max(ans, tmp_point) -    print(ans) -else: -    loop = [0] * N -    for i in range(N): -        count = 0 -        check = [False] * N -        tmp_point = 0 -        nv = i -        while True: -            nvv = P[nv] -            nvv -= 1 -            if check[nvv] == True: -                break -            check[nvv] = True -            tmp_point += C[nvv] -            count += 1 -            nv = nvv -            ans = max(ans, tmp_point) -        loop[i] = [tmp_point, count, i] -    loop.sort(reverse=True) -    # print(loop) -    new_ans = -10000000 -    for value, counter, key in loop: -        if value < 0: -            break -        shou = K // counter - 1 -        amari = K % counter + counter -        tmp_ans = value * shou -        new_ans = max(new_ans, tmp_ans) -        count = 0 -        nv = key -        while count < amari: -            nvv = P[nv] -            nvv -= 1 -            tmp_ans += C[nvv] -            count += 1 -            nv = nvv -            new_ans = max(new_ans, tmp_ans) -    print((max(loop[0][0], ans, new_ans))) +ans = -float("inf") +for s in range(N): +    ### Step1 +    S = []  # 累積和S. ただし, 初項は0ではなく1回目の移動後の得点とする. +    # 1回目の移動 +    i = P[s] - 1 +    S.append(C[i]) +    # 2回目以降の移動. スタート地点に戻ってくるまで繰り返し. +    while i != s: +        i = P[i] - 1 +        S.append(S[-1] + C[i]) +    ### Step2: KとSの長に応じて場合分けして, 得点の最大値を求める. +    # 1周未満しか移動できない場合: +    if K <= len(S): +        score = max(S[:K]) +    # 1周以上回ることができるが, ループを1周したときに得点が減る場合: +    elif S[-1] <= 0: +        score = max(S) +    # 1週以上回ることができ, かつループを1週するごとに得点が増える場合: +    else: +        # ループを (K // len(S) - 1)回 廻る場合: +        score1 = S[-1] * (K // len(S) - 1) +        score1 += max(S) +        # ループを (K // len(S))回 廻る場合: +        score2 = S[-1] * (K // len(S)) +        r = K % len(S) +        if r != 0: +            score2 += max(0, max(S[:r])) +        # score1 と score2 の大きい方がこの場合の得点の最大値 +        score = max(score1, score2) +    ans = max(ans, score) +print(ans)