#include<bits/stdc++.h>
#define int long long
#define maxn 1010
#define maxm 1010
using namespace std;
int n,m,d,top,dfn[maxn],low[maxn];
int w[maxn],v[maxn],stk[maxn];
int W[maxn],V[maxn],SSC[maxn];
int dp[maxn][maxm],indgr[maxn];
int dfcnt,ssccnt;
bool instk[maxn],gogo[maxn][maxn];
vector<int>edge[maxn],ssc[maxn],Edge[maxn];
void Tarjan(int u){
dfn[u]=low[u]=++dfcnt;
stk[++top]=u;instk[u]=1;
for(int i=0;i<edge[u].size();++i){
int vv=edge[u][i];
if(!dfn[vv]){
Tarjan(vv);
low[u]=min(low[vv],low[u]);
}
else low[u]=min(low[u],dfn[vv]);
}
if(dfn[u]==low[u]){
int tp;
++ssccnt;
do{
tp=stk[top--];
SSC[tp]=ssccnt;
instk[tp]=0;
ssc[ssccnt].push_back(tp);
}while(tp!=u);
}
return;
}
void dfs(int rt){
for(int i=W[rt];i<=m;++i)dp[rt][i]=V[rt];
for(int i=0;i<Edge[rt].size();++i){
int to=Edge[rt][i];
dfs(to);
for(int j=m;j>=0;--j){
for(int k=0;k<=j;++k){
dp[rt][j]=max(dp[rt][j],dp[rt][k]+dp[to][j-k]);
}
}
}
return;
}
signed main(){
cin>>n>>m;
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;
edge[d].push_back(i);
}
for(int i=0;i<=n;++i)if(!dfn[i])Tarjan(i);
for(int i=1;i<=ssccnt;++i){
for(int j=0;j<ssc[i].size();++j){
W[i]+=w[ssc[i][j]];
V[i]+=v[ssc[i][j]];
}
}
for(int i=0;i<=n;++i){
for(int j=0;j<edge[i].size();++j){
int to=edge[i][j];
if(SSC[i]!=SSC[to])
Edge[SSC[i]].push_back(SSC[to]),indgr[SSC[to]]++;
}
}
for(int i=1;i<=ssccnt;++i)if(SSC[0]!=i && indgr[i]==0)Edge[SSC[0]].push_back(i);
dfs(SSC[0]);
cout<<dp[SSC[0]][m];
return 0;
}