#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 5005;
vector<int> g[maxn], ed[maxn];
int n, k, dp[maxn][maxn], num[maxn], low[maxn], sccid[maxn], scc, par[maxn], sz[maxn], v[maxn], indegree[maxn], sccv[maxn], tplt, t;
vector<int> id;
stack<int> st;
bool vis[maxn];
struct node{
	int id, sz, v;
};
vector<node> a;
void dfs(int u, int p)
{
	vis[u] = 1;
	low[u] = num[u] = ++t;
	st.push(u);
	for(int v : g[u])
	{
		if(v == p) continue;
		if(num[v]) low[u] = min(low[u], num[v]);
		else
		{
			dfs(v, u);
			low[u] = min(low[u], low[v]);
		}
	}
	if(low[u] == num[u])
	{
		scc++;
		while(st.top() != u)
		{
			int v = st.top();
			st.pop();
			sccid[v] = scc;
		}
		int v = st.top();
		st.pop();
		sccid[v] = scc;
	}
}
void dfs2(int u)
{
	for(int v : ed[u])
	{
		dfs2(v);
		sccv[u] += sccv[v];
		sz[u] += sz[v];
	}
	a.push_back({tplt, sz[u], sccv[u]});
}
int32_t main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	if(fopen("actnet.inp", "r"))
	{
		freopen("actnet.inp", "r", stdin);
		freopen("actnet.out", "w", stdout);
	}
	cin >> n >> k;
	for(int i = 1; i <= n; i++)
	{
		cin >> par[i];
		if(par[i] != i) 
		{
			g[i].push_back(par[i]);
			g[par[i]].push_back(i);
		}
	}
	for(int i = 1; i <= n; i++) cin >> v[i];
	for(int i = 1; i <= n; i++) if(!vis[i]) dfs(i, i);
// 	cout << sccid[5] << ' ' << sccid[6] << '\n';
	for(int i = 1; i <= n; i++)
	{
	   // if(par[i] == i) indegree[sccid[i]]++;
		if(sccid[par[i]] != sccid[i])
		{
		    ed[sccid[i]].push_back(sccid[par[i]]);
// 			ed[sccid[par[i]]].push_back(sccid[i]);
			indegree[sccid[par[i]]]++;
		}
		sccv[sccid[i]] += v[i];
		sz[sccid[i]]++;
	}
// 	cout << indegree[3] << '\n';
	for(int i = 1; i <= scc; i++)
	{
		if(indegree[i] == 0)
		{
			tplt++;
			dfs2(i);
		}
	}
	int last = 0, ans = 0;
	dp[1][a[0].sz] = a[0].v;
	for(int i = 2; i <= a.size(); i++)
	{
		for(int j = 0; j <= k; j++)
		{
			dp[i][j] = dp[i - 1][j];
		}
		if(a[i - 1].id != a[i - 2].id) last = i - 1;
		for(int j = 0; j <= k; j++)
		{
			if(j + a[i - 1].sz <= k) dp[i][j + a[i - 1].sz] = max(dp[i][j + a[i - 1].sz], dp[last][j] + a[i - 1].v);
			ans = max(ans, dp[i][j]);
		}
	}
// 	for(node x : a) cout << x.id << ' ' << x.sz << ' ' << x.v << '\n';
	cout << ans;
	return 0;
}