//bismillahir rahmanir rahim            //Author:Fayed Anik
 
#include <bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
 
using namespace std;
//using namespace __gnu_pbds;
 
//#define         ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
#define         ll                          long  long
#define         lf                          double
#define         pb(x)                       push_back(x)
#define         ull                         unsigned long long
#define         sfl(a)                      scanf("%lld",&a)
#define         sf(a)                       scanf("%d",&a)
#define         pf(a)                       printf("%d\n",a)
#define         pfl(a)                      printf("%lld\n",a)
#define         FOR(x,n)                    for(ll x=1;x<=n;++x)
#define         pii                         pair< ll , ll >
#define         mp(a,b)                     make_pair(a,b)
#define         UNIQUE(v)                   v.resize(distance(v.begin(),unique(v.begin(),v.end())))
#define         mod                         1000000007
#define         INF                         2e18
#define         EPS                         1e-15
#define         f1                          first
#define         f2                          second
#define         all(v)                      v.begin(),v.end()
#define         PI                          acos(-1)
#define         printminusone               printf("-1\n")
#define         bug                         printf("bug")
#define         FILEIN                      freopen("in.txt","r",stdin)
#define         FILEOUT                     freopen("out.txt","w",stdout)
 
//ll SET(ll mask,ll pos){ return mask = (mask | (1ll<<pos)); }
//ll RESET(ll mask,ll pos){ return mask = mask & ~(1ll<<pos); }
//bool CHECK(ll mask,ll pos) { return (bool) (mask & (1ll<<pos)); }
//priority_queue <ll, vector<ll>, greater<ll> > pq;
//int dx[]={0,0,1,-1,1,1,-1,-1};
//int dy[]={1,-1,0,0,1,-1,1,-1};

#define lim 5005

ll p[lim],c[lim];
bool vis[lim];

int main(){
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    ll n,k;
    sfl(n),sfl(k);
    for(ll i=1;i<=n;i++){
        sfl(p[i]);
    }
    for(ll i=1;i<=n;i++){
        sfl(c[i]);
    }
    ll ans = -INF;
    for(ll i=1;i<=n;i++){
        for(ll j=1;j<=n;j++) vis[j]=0;
        vector<ll>v;
        ll nd = i,t=k;
        while(!vis[nd] and t){
            vis[nd]=1;
            nd = p[nd];
            v.pb(c[nd]);
        }
        ll sum=0,sz=v.size(),tot=0,baki;
        if( sz>k ){
            for(auto x:v){
                if(t==0) break;
                sum += x;
                ans = max(ans,sum);
                t--;
            }
        }
        else{
            t = k/sz;
            for(auto x:v){
                tot += x;
                ans = max(ans,tot);
            }
            sum = tot*t;
            ans = max(ans,sum);
            baki = k%sz;
            for(auto x:v){
                if(baki){
                    baki--;
                    sum += x;
                    ans =max(ans,sum);
                }
                else{
                    break;
                }
            }
            if( t>1 ){
                sum = tot*(t-1);
                ans = max(ans,sum);
                for(auto x:v){
                    sum += x;
                    ans = max(ans,sum);
                }
            }
        }
    }
    pfl(ans);
    return 0;
}

Measured memory_bytes: 3928