#include<bits/stdc++.h>
using namespace std;
const int N=1005,M=1e4+5;
int read(){
int x=0,f=1;
char c=getchar();
while(!isdigit(c) && c!='-') c=getchar();
if(c=='-') f=-1,c=getchar();
while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
return x*f;
}
int f[N][N];
int head[N],ver[M],Next[M],tot;
int hc[N],vc[M],nc[M],deg[N],tot2;
int dfn[N],low[N],st[N],ins[N],c[N];
int w[N],v[N],W[N],V[N];
int n,m,num,top,cnt;
void add(int x,int y){
ver[tot]=y; Next[tot]=head[x]; head[x]=tot++;
}
void add_c(int x,int y){
vc[tot2]=y; nc[tot2]=hc[x]; hc[x]=tot2++;
}
void tarjan(int x){
dfn[x]=low[x]=++num;
st[++top]=x; ins[x]=1;
for(int i=head[x];~i;i=Next[i]){
int y=ver[i];
if(dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(ins[y])
low[x]=min(low[x],dfn[y]);
}
if(dfn[x]==low[x]){
cnt++; int y;
do{
y=st[top--]; ins[y]=0;
c[y]=cnt;
W[cnt]+=w[y]; V[cnt]+=v[y];
}while(x!=y);
}
}
void dfs(int x){
for(int i=W[x];i<=m;i++) f[x][i]=V[x];
for(int i=hc[x];~i;i=nc[i]){
int y=vc[i];
dfs(y);
for(int j=m;j>=W[x];j--){
for(int k=0;k<=j-W[x];k++){
f[x][j]=max(f[x][j],f[x][j-k]+f[y][k]);
}
}
}
}
int main(){
memset(head,-1,sizeof(head));
n=read(); m=read();
for(int i=1;i<=n;i++) w[i]=read();
for(int i=1;i<=n;i++) v[i]=read();
for(int i=1;i<=n;i++){
int d=read();
if(d) add(d,i);
}
for(int i=1;i<=n;i++){
if(!dfn[i]) tarjan(i);
}
memset(hc,-1,sizeof(hc));
for(int x=1;x<=n;x++){
for(int i=head[x];~i;i=Next[i]){
int y=ver[i];
if(c[x]==c[y]) continue;
add_c(c[x],c[y]); deg[c[y]]++;
}
}
for(int i=1;i<=cnt;i++){
if(!deg[i]) add_c(0,i);
}
dfs(0);
printf("%d\n",f[0][m]);
return 0;
}