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

# 一度たずねた場所はループが判明しているのでそのままにする(何度移動させるかに関係なくtree構造がつながっているかを調べたい)
ans = -10 ** 18
for i in range(N):
    x = i
    loop = []
    total = 0
    while True:
        x = P[x] - 1
        loop.append(C[x])
        total += C[x]
        if x == i:
            break

    T = len(loop)
    tmp = 0
    for j in range(T):
        tmp += loop[j]
        if K < j + 1:
            break
        now = tmp
        # 一周のループが正の時のみ何度も回す価値がある。それ以外のときはそれまでの最大をとる
        if total > 0:
            loop_times = (K - (j + 1)) // T
            now += total * loop_times

        ans = max(ans, now)
print(ans) 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):
    x = i
    loop = []
    total = 0
    while True:
        x = P[x] - 1
        loop.append(C[x])
        total += C[x]
        if x == i:
            break

    T = len(loop)
    tmp = 0
    for j in range(T):
        tmp += loop[j]
        if K < j + 1:
            break
        now = tmp
        # 一周のループが正の時のみ何度も回す価値がある。それ以外のときはそれまでの最大をとる
        if total > 0:
            loop_times = (K - (j + 1)) // T
            now += total * loop_times

        ans = max(ans, now) i range(N) range N x = i x i loop = [] loop [] total = 0 total 0 while True:
        x = P[x] - 1
        loop.append(C[x])
        total += C[x]
        if x == i:
            break

     True x = P[x] - 1 x P[x] - 1 P[x] P x 1 loop.append(C[x]) loop.append loop append C[x] C x total += C[x] total C[x] C x if x == i:
            break

     x == i x i break T = len(loop) T len(loop) len loop tmp = 0 tmp 0 for j in range(T):
        tmp += loop[j]
        if K < j + 1:
            break
        now = tmp
        # 一周のループが正の時のみ何度も回す価値がある。それ以外のときはそれまでの最大をとる
        if total > 0:
            loop_times = (K - (j + 1)) // T
            now += total * loop_times

        ans = max(ans, now) j range(T) range T tmp += loop[j] tmp loop[j] loop j if K < j + 1:
            break
         K < j + 1 K j + 1 j 1 break now = tmp now tmp if total > 0:
            loop_times = (K - (j + 1)) // T
            now += total * loop_times

         total > 0 total 0 loop_times = (K - (j + 1)) // T loop_times (K - (j + 1)) // T K - (j + 1) K j + 1 j 1 T now += total * loop_times now total * loop_times total loop_times ans = max(ans, now) ans max(ans, now) max ans now print(ans) print ans tmp += loop[j] loop[j] tmp now += total * loop_times total * loop_times now x = P[x] - 1 P[x] - 1 x ans = -10 ** 18 -10 ** 18 ans N, K = map(int, input().split()) map(int, input().split()) N K = map(int, input().split()) map(int, input().split()) K T = len(loop) len(loop) T P = list(map(int, input().split())) list(map(int, input().split())) P loop_times = (K - (j + 1)) // T (K - (j + 1)) // T loop_times tmp = 0 0 tmp C = list(map(int, input().split())) list(map(int, input().split())) C loop = [] [] loop ans = max(ans, now) max(ans, now) ans total += C[x] C[x] total x = i i x total = 0 0 total now = tmp tmp now
N, K = map(int, input().split())
P = list(map(int, input().split()))
C = list(map(int, input().split()))

# 一度たずねた場所はループが判明しているのでそのままにする(何度移動させるかに関係なくtree構造がつながっているかを調べたい)
ans = -10 ** 18
for i in range(N):
    x = i
    loop = []
    total = 0
    while True:
        x = P[x] - 1
        loop.append(C[x])
        total += C[x]
        if x == i:
            break

    T = len(loop)
    tmp = 0
    for j in range(T):
        tmp += loop[j]
        if K < j + 1:
            break
        now = tmp
        # 一周のループが正の時のみ何度も回す価値がある。それ以外のときはそれまでの最大をとる
        if total > 0:
            loop_times = (K - (j + 1)) // T
            now += total * loop_times

        ans = max(ans, now)
print(ans)
