# ABC175 D
import bisect

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

F=[0]*N

def search(n):
    res=[]
    l=0
    m=n
    tmp_res=0
    isloop=0
    if F[n-1]:
        s,L=F[n-1]
    while 1:
        m=P[m-1]
        tmp_res+=C[m-1]
        l+=1
        if F[n-1]==0:
            res.append((tmp_res,l))
        else:
            res.append(tmp_res+s*((K-l)//L) if s>0 and K>=l else tmp_res)
        if m==n:
            isloop=1
            break
        if l==K:
            break
    if F[n-1]==0:
        if isloop:
            s,L=res[-1]
            if not F[n-1]:
                m=n
                while 1:
                    F[m-1]=(s,L)
                    m=P[m-1]
                    if m==n:
                        break
        else:
            s=-1
        p=max([p+s*((K-k)//len(res)) if s>0 and K>=k else p for p,k in res])
    else:
        p=max(res)
    return p

res=-float('inf')
for i in range(N):
    res=max(res,search(i+1))
print(res) import bisect bisect 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 F=[0]*N F [0]*N [0] 0 N def search(n):
    res=[]
    l=0
    m=n
    tmp_res=0
    isloop=0
    if F[n-1]:
        s,L=F[n-1]
    while 1:
        m=P[m-1]
        tmp_res+=C[m-1]
        l+=1
        if F[n-1]==0:
            res.append((tmp_res,l))
        else:
            res.append(tmp_res+s*((K-l)//L) if s>0 and K>=l else tmp_res)
        if m==n:
            isloop=1
            break
        if l==K:
            break
    if F[n-1]==0:
        if isloop:
            s,L=res[-1]
            if not F[n-1]:
                m=n
                while 1:
                    F[m-1]=(s,L)
                    m=P[m-1]
                    if m==n:
                        break
        else:
            s=-1
        p=max([p+s*((K-k)//len(res)) if s>0 and K>=k else p for p,k in res])
    else:
        p=max(res)
    return p search res=[] res [] l=0 l 0 m=n m n tmp_res=0 tmp_res 0 isloop=0 isloop 0 if F[n-1]:
        s,L=F[n-1]
     F[n-1] F n-1 n 1 s,L=F[n-1] s F[n-1] F n-1 n 1 L while 1:
        m=P[m-1]
        tmp_res+=C[m-1]
        l+=1
        if F[n-1]==0:
            res.append((tmp_res,l))
        else:
            res.append(tmp_res+s*((K-l)//L) if s>0 and K>=l else tmp_res)
        if m==n:
            isloop=1
            break
        if l==K:
            break
     1 m=P[m-1] m P[m-1] P m-1 m 1 tmp_res+=C[m-1] tmp_res C[m-1] C m-1 m 1 l+=1 l 1 if F[n-1]==0:
            res.append((tmp_res,l))
        else:
            res.append(tmp_res+s*((K-l)//L) if s>0 and K>=l else tmp_res)
         F[n-1]==0 F[n-1] F n-1 n 1 0 res.append((tmp_res,l)) res.append res append (tmp_res,l) tmp_res l res.append(tmp_res+s*((K-l)//L) if s>0 and K>=l else tmp_res) res.append res append tmp_res+s*((K-l)//L) if s>0 and K>=l else tmp_res s>0 and K>=l s>0 s 0 K>=l K l tmp_res+s*((K-l)//L) tmp_res s*((K-l)//L) s (K-l)//L K-l K l L tmp_res if m==n:
            isloop=1
            break
         m==n m n isloop=1 isloop 1 break if l==K:
            break
     l==K l K break if F[n-1]==0:
        if isloop:
            s,L=res[-1]
            if not F[n-1]:
                m=n
                while 1:
                    F[m-1]=(s,L)
                    m=P[m-1]
                    if m==n:
                        break
        else:
            s=-1
        p=max([p+s*((K-k)//len(res)) if s>0 and K>=k else p for p,k in res])
    else:
        p=max(res)
     F[n-1]==0 F[n-1] F n-1 n 1 0 if isloop:
            s,L=res[-1]
            if not F[n-1]:
                m=n
                while 1:
                    F[m-1]=(s,L)
                    m=P[m-1]
                    if m==n:
                        break
        else:
            s=-1
         isloop s,L=res[-1] s res[-1] res -1 L if not F[n-1]:
                m=n
                while 1:
                    F[m-1]=(s,L)
                    m=P[m-1]
                    if m==n:
                        break
         not F[n-1] F[n-1] F n-1 n 1 m=n m n while 1:
                    F[m-1]=(s,L)
                    m=P[m-1]
                    if m==n:
                        break
         1 F[m-1]=(s,L) F[m-1] F m-1 m 1 (s,L) s L m=P[m-1] m P[m-1] P m-1 m 1 if m==n:
                        break
         m==n m n break s=-1 s -1 p+s*((K-k)//len(res)) if s>0 and K>=k else p for p,k in res for p,k in res p k res for p,k in res p+s*((K-k)//len(res)) if s>0 and K>=k else p s>0 and K>=k s>0 s 0 K>=k K k p+s*((K-k)//len(res)) p s*((K-k)//len(res)) s (K-k)//len(res) K-k K k len(res) len res p p=max([p+s*((K-k)//len(res)) if s>0 and K>=k else p for p,k in res]) p max([p+s*((K-k)//len(res)) if s>0 and K>=k else p for p,k in res]) max [p+s*((K-k)//len(res)) if s>0 and K>=k else p for p,k in res] p=max(res) p max(res) max res return p p n n res=-float('inf') res -float('inf') float('inf') float 'inf' for i in range(N):
    res=max(res,search(i+1)) i range(N) range N res=max(res,search(i+1)) res max(res,search(i+1)) max res search(i+1) search i+1 i 1 print(res) print res def search(n):
    res=[]
    l=0
    m=n
    tmp_res=0
    isloop=0
    if F[n-1]:
        s,L=F[n-1]
    while 1:
        m=P[m-1]
        tmp_res+=C[m-1]
        l+=1
        if F[n-1]==0:
            res.append((tmp_res,l))
        else:
            res.append(tmp_res+s*((K-l)//L) if s>0 and K>=l else tmp_res)
        if m==n:
            isloop=1
            break
        if l==K:
            break
    if F[n-1]==0:
        if isloop:
            s,L=res[-1]
            if not F[n-1]:
                m=n
                while 1:
                    F[m-1]=(s,L)
                    m=P[m-1]
                    if m==n:
                        break
        else:
            s=-1
        p=max([p+s*((K-k)//len(res)) if s>0 and K>=k else p for p,k in res])
    else:
        p=max(res)
    return p def search(n):
    res=[]
    l=0
    m=n
    tmp_res=0
    isloop=0
    if F[n-1]:
        s,L=F[n-1]
    while 1:
        m=P[m-1]
        tmp_res+=C[m-1]
        l+=1
        if F[n-1]==0:
            res.append((tmp_res,l))
        else:
            res.append(tmp_res+s*((K-l)//L) if s>0 and K>=l else tmp_res)
        if m==n:
            isloop=1
            break
        if l==K:
            break
    if F[n-1]==0:
        if isloop:
            s,L=res[-1]
            if not F[n-1]:
                m=n
                while 1:
                    F[m-1]=(s,L)
                    m=P[m-1]
                    if m==n:
                        break
        else:
            s=-1
        p=max([p+s*((K-k)//len(res)) if s>0 and K>=k else p for p,k in res])
    else:
        p=max(res)
    return p search P=list(map(int,input().split())) list(map(int,input().split())) P C=list(map(int,input().split())) list(map(int,input().split())) C F=[0]*N [0]*N F res=-float('inf') -float('inf') res res=max(res,search(i+1)) max(res,search(i+1)) res K=map(int,input().split()) map(int,input().split()) K N,K=map(int,input().split()) map(int,input().split()) N
# ABC175 D
import bisect

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

F=[0]*N

def search(n):
    res=[]
    l=0
    m=n
    tmp_res=0
    isloop=0
    if F[n-1]:
        s,L=F[n-1]
    while 1:
        m=P[m-1]
        tmp_res+=C[m-1]
        l+=1
        if F[n-1]==0:
            res.append((tmp_res,l))
        else:
            res.append(tmp_res+s*((K-l)//L) if s>0 and K>=l else tmp_res)
        if m==n:
            isloop=1
            break
        if l==K:
            break
    if F[n-1]==0:
        if isloop:
            s,L=res[-1]
            if not F[n-1]:
                m=n
                while 1:
                    F[m-1]=(s,L)
                    m=P[m-1]
                    if m==n:
                        break
        else:
            s=-1
        p=max([p+s*((K-k)//len(res)) if s>0 and K>=k else p for p,k in res])
    else:
        p=max(res)
    return p

res=-float('inf')
for i in range(N):
    res=max(res,search(i+1))
print(res)