得分情况
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 2e2 + 5;
const int MAXTOT = 5e2 + 5;
const int INF = (int)INFINITY/2-1;
int n,tot,w[MAXN],v[MAXN],d[MAXN],W[MAXN],V[MAXN],dfn[MAXN],low[MAXN],col[MAXN],stk[MAXN],dp[MAXN][MAXTOT],hasfa[MAXN];
void getmax(int &a,const int &b){if(a<b)a=b;}
void getmin(int &a,const int &b){if(a>b)a=b;}
vector<int>e[MAXN];
void tarjan(int u){
dfn[u]=low[u]=++*dfn;
stk[++*stk]=u;
for(int v:e[u]){
if(!dfn[v]){
tarjan(v);
getmin(low[u],low[v]);
}else getmin(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
int tp;
++*col;
do{
tp=stk[(*stk)--];
W[*col]+=w[tp];
V[*col]+=v[tp];
col[tp]=*col;
}while(tp!=u);
}
}
void dfs_ans(int u){
for(int v:e[u]){
dfs_ans(v);
for(int i=tot;i>=W[v];i--){
for(int j=0;j+W[v]<=i;j++){
getmax(dp[u][i],dp[u][i-j-W[v]]+dp[v][j]+V[v]);
}
}
}
}
signed main(){
cin>>n>>tot;
*col=n;
for(int i=1;i<=n;i++)cin>>w[i];
for(int i=1;i<=n;i++)cin>>v[i];
for(int i=1;i<=n;i++)cin>>d[i],e[d[i]].emplace_back(i);
for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
for(int i=1;i<=n;i++){
if(d[i]&&col[d[i]]!=col[i]){
e[col[d[i]]].emplace_back(col[i]);
hasfa[col[i]]=1;
}
}
++*col;
for(int i=n+1;i<*col;i++)if(!hasfa[i])e[*col].emplace_back(i);
dfs_ans(*col);
cout<<dp[*col][tot];
return 0;
}