#include<bits/stdc++.h>
using namespace std;
const int N=510,M=510;
int n,m,i,ww[N],vv[N],x;
int last[N],c;
bool vis[N];
int dp[N][M];
int low[N],dfn[N],idx;
int st[N],tp;
int xx[N],yy[N],id[N];
int w[N],v[N],d,din[N];
struct Node{
int to,next;
}a[N<<1];
void add(int u,int v)
{
a[++c]={v,last[u]};
last[u]=c;
}
void tarjan(int x)
{
int i,to,t;
low[x]=dfn[x]=++idx;
st[++tp]=x;
vis[x]=true;
for (i=last[x];i;i=a[i].next)
{
to=a[i].to;
if (!dfn[to])
{
tarjan(to);
low[x]=min(low[x],low[to]);
}
else if (vis[to]) low[x]=min(low[x],dfn[to]);
}
if (low[x]==dfn[x])
{
d++;
do
{
t=st[tp];
tp--;
vis[t]=false;
w[d]+=ww[t];
v[d]+=vv[t];
id[t]=d;
}while (t!=x);
}
}
void dfs(int x)
{
int i,j,k,to;
for (i=w[x];i<=m;i++) dp[x][i]=v[x];
for (i=last[x];i;i=a[i].next)
{
to=a[i].to;
dfs(to);
for (j=m;j>=w[x];j--)
{
for (k=0;k<=j-w[x];k++) dp[x][j]=max(dp[x][j],dp[x][j-k-w[x]]+dp[to][k]+v[x]);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++) scanf("%d",&ww[i]);
for (i=1;i<=n;i++) scanf("%d",&vv[i]);
for (i=1;i<=n;i++)
{
scanf("%d",&x);
if (x) add(x,i);
xx[i]=x;
yy[i]=i;
}
for (i=1;i<=n;i++)
{
if (!dfn[i]) tarjan(i);
}
memset(last,0,sizeof(last));
c=0;
for (i=1;i<=n;i++)
{
if (id[xx[i]]!=id[yy[i]])
{
add(id[xx[i]],id[yy[i]]);
din[id[yy[i]]]++;
}
}
for (i=1;i<=d;i++)
{
if (!din[i]) add(0,i);
}
dfs(0);
printf("%d",dp[0][m]);
return 0;
}