#include<bits/stdc++.h>
//One implementation to rule them all?
#define db              double
#define ll              long long int
#define ld              long double
//#define int           long long int
#define ull             unsigned long long
#define fi              first
#define se              second
#define rep(i,a,n)      for(int i=a;i<n;i++)
#define repr(i,n,b)     for(int i=n;i>=b;i--)
#define endl            '\n'
#define mem(a,b)        memset(a, b, sizeof a)
#define mkp             make_pair
#define pb              push_back
#define max3(a,b,c)     max(a,max(b,c))
#define min3(a,b,c)     min(a,min(b,c))
#define w(t)            int t; cin>>t; while(t--)
#define all(a)          a.begin(), a.end()
#define sz(a)           int((a).size())
#define debug           cerr << " Here. " << endl;
#define dbg(x)          cerr << #x << " = " << x << endl;
#define dbgp(x)         cerr<<"[ "<<#x<<".ff : "<<x.first<<", "<<#x<<".ss : "<<x.second<<" ]"<<endl
#define dbgs(x)         cerr<<"[ "; for(auto i:x) cerr<<i<<" "; cerr<<" ]"<<endl;
#define dbgm(x)         cerr<<"----------"<<endl; for(auto i:x) cerr<<i.fi<<":"<<i.se<<endl; cerr<<"----------"; 
#define printdb(i)      printf("%.12lf\n",i)
#define isOn(S, j)      (S & (1<<j))
#define setBit(S, j)    (S |= (1<<j))
#define clearBit(S, j)  (S &= ~(1<<j))
#define toggleBit(S, j) (S ^= (1<<j))
#define lowBit(S)       (S & (-S))
#define setAll(S, n)    (S = (1<<n)-1)
#define turnOffLastBit(S) ((S) & (S-1))
#define turnOnLastZero(S) ((S) | (S+1))
//Can use tuples in C++17
using namespace std;
typedef map < int, int > mii;
typedef vector < int > vii;
typedef vector < ll > vll;
typedef vector < vii > vvi;
typedef pair < int,int > pii;
template <class T> using min_heap = priority_queue<T,vector<T>,greater<T> >;
template <class T> using max_heap = priority_queue<T>;
const db PI =           acos(-1);
const int INF =         0x3f3f3f3f;
const ll LINF =         (ll)2e18;
db eps       =          1e-5;
ll mod       =          (1000000007LL);    //998244353   
void print(vector <int> &arr){
    for(int i=0;i<arr.size();i++)
        cout<<arr[i]<<" ";
    
    cout<<endl;
}
void printll(vector <ll> &arr){
    for(int i=0;i<arr.size();i++)
        cout<<arr[i]<<" ";
    
    cout<<endl;
}

ll ncr(ll n, ll r)
{
    r=min(r,n-r);
    ll A[r],i,j,B[r];
    iota(A,A+r,n-r+1);  
    iota(B,B+r,1);     

    ll g;
    for(i=0;i<r;i++)
    for(j=0;j<r;j++)
    {
        if(B[i]==1)
            break;
        g=__gcd(B[i], A[j] );
        A[j]/=g;
        B[i]/=g;
    }
    ll ans=1;
    for(i=0;i<r;i++)
        ans=(ans*A[i]%mod);
    return ans;
}
ll binpow(ll a, ll b, ll m) {
    a %= m;
    ll res = 1;
    while (b > 0) {
        if (b & 1)
            res = res * a % m;
        a = a * a % m;
        b >>= 1;
    }
    return res;
}

const int SIZE=2e5+10;                                //constant SIZE here
bool judge(int a[], int n){
    static int used[SIZE+1];
    for(int i = 1; i <= n; i++) used[i] = 0;
    for(int i = 0; i < n; i++) used[a[i]] = 1;
    for(int i = 1; i <= n; i++) {
        if(!used[i]) return 0;
    }
    return 1;
}
ll n,m,r,u=INT_MAX,v=INT_MIN,k;
vvi adj(SIZE);
vii color(SIZE,-1);
vector <bool> vis(SIZE,false);
void dfs(int u, int c){
	vis[u]=1;
	color[u]=c;
	c=1-c;
	for(auto i:adj[u]){
		if(!vis[i]){
			dfs(i,c);
		}
	}
}
vll p, c;

ll maxSum(vll &a , int k) {
	if(a.empty())
		return INT_MIN;
	ll ans = INT_MIN, sum = 0,s = 0;
	int n = a.size();
	for(int i = 0; i < n; i++) {
		s += a[i];
		a.push_back(a[i]);
	}
	for(int i = 0; i < n; i++)
		a.push_back(a[i]);
	ll tt = k/ n;
	k -= tt * n;
	if(k < n && tt > 0) {
		k += n;
		tt--;
	}
	s *= tt;
	for(int i = 0; i < 2 * n; i++) {
		sum = 0;
		for(int j = i; j < min(i + k, 3 * n); j++){
			sum += a[j];
			ans = max(ans , sum);
		}
	}
	ans = max(ans , ans + s);
	return ans;
}
int main(){ 
//CONDITION && cout << "YES" || cout << "NO"; cout << '\n';
//////////////////////////////////////////////////////////////////
//  ios_base::sync_with_stdio(false);
//  cin.tie(NULL);
//  cout.tie(NULL);
//  cerr.tie(NULL);
//For fast IO
///////////////////////////////////////////////////////////////////// 
// Have you thought about it enough?
/////////////////////////////////////////////////////////////////////
//  std::cout.unsetf ( std::ios::floatfield );  // floatfield not set
//  std::cout.precision(16);
//  freopen("input.txt","r",stdin);
//  freopen("output.txt","w",stdout);
	cin>>n>>k;
	p.resize(n);
	c.resize(n);
	rep(i,0,n) cin>>p[i];
	rep(i,0,n) cin>>c[i];
	bool vis[n]={0};
	ll ans=INT_MIN;
	rep(i,0,n){
		if(!vis[i]){
			vis[i]=1;
			ll sum=0;
			sum+=c[i];
			int j=p[i]-1;
			vll arr;
			arr.pb(c[i]);
			while(j!=i){
				vis[j]=1;
				sum+=c[j];
				arr.pb(c[j]);
				j=p[j]-1;
			}
			//printll(arr);
			//dbg(sum);
			ll maxm=INT_MIN;
		
			ans=max(ans, maxSum(arr,k));
			
			//dbg(maxm);	
			
		}
	}
	cout<<ans<<endl;
    return 0;
}


Measured memory_bytes: 9128