#include<bits/stdc++.h>
using namespace std;
const int maxn=109;
int head[maxn],nxt[maxn],fr[maxn],to[maxn],tot;
void add(int u,int v)
{
if(u==0)return ;
nxt[++tot]=head[u];
head[u]=tot;
fr[tot]=u;
to[tot]=v;
}
int W[maxn],V[maxn];
int dfn[maxn],low[maxn],cnt;
int st[maxn],top;
bool in[maxn];
int scc[maxn],SCC;
void tarjan(int u)
{
dfn[u]=low[u]=++cnt;
st[++top]=u;
in[u]=true;
for(int i=head[u];i!=-1;i=nxt[i])
{
int v=to[i];
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(in[v])
{
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u])
{
int uu;
SCC++;
do
{
uu=st[top--];
in[uu]=false;
scc[uu]=SCC;
}while(uu!=u);
}
}
int f[109][509];
int n,m;
int nv[109],nw[109];
bool vis[109];
void dfs(int u)
{
f[u][nw[u]]=nv[u];
for(int i=head[u];i!=-1;i=nxt[i])
{
int v=to[i];
dfs(v);
for(int j=m;j>=0;j--)
{
for(int k=0;j-k>=0;k++)
{
f[u][j]=max(f[u][j],f[u][j-k]+f[v][k]);
}
}
}
}
int deg[maxn];
int main()
{
memset(head,-1,sizeof(head));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&W[i]);
}
for(int i=1;i<=n;i++)
{
scanf("%d",&V[i]);
}
for(int i=1;i<=n;i++)
{
int u;
scanf("%d",&u);
add(u,i);
}
for(int i=1;i<=n;i++)
{
if(!dfn[i])
{
tarjan(i);
}
}
memset(head,-1,sizeof(head));
int TOT=tot;
tot=0;
for(int i=1;i<=TOT;i++)
{
int u=fr[i],v=to[i];
u=scc[u],v=scc[v];
if(u==v)continue;
add(u,v);
++deg[v];
}
for(int i=1;i<=SCC;i++)
{
if(!deg[i])add(SCC+1,i);
}
for(int i=1;i<=n;i++)
{
nw[scc[i]]+=W[i];
nv[scc[i]]+=V[i];
}
dfs(SCC+1);
int ans=0;
for(int i=0;i<=m;i++)
{
ans=max(ans,f[SCC+1][i]);
}
printf("%d",ans);
return 0;
}