#include <bits/stdc++.h>
#define MAXN 100007
using namespace std;
vector<int> g[MAXN];
vector<long long> w[MAXN],nz,pc;
bool c[MAXN],vi[MAXN];
int inv[MAXN],deg[MAXN],n,x;
long long lp[MAXN],tg[MAXN],curt,vc,res,d,sk,t,tvc,curl;
void topo()
{
    queue<int> q;
    for(int i=1;i<=n;i++) deg[i]=g[i].size();
    for(int i=1;i<=n;i++) if(deg[i]==0) q.push(i);
    while(!q.empty())
    {
        int u=q.front(); q.pop();
        c[u]=false;
        deg[inv[u]]--;
        if(deg[inv[u]]==0) q.push(inv[u]);
    }
}
int binarna(int l,int r,long long val)
{
    if(l==r) return l;
    int s=(l+r+1)/2;
    if(nz[s]<=val) return binarna(s,r,val);
    return binarna(l,s-1,val);
}
void dfs(int s,long long sm,long long pp)
{
    if(t<=pp) return;
    long long tres=sm+((t-pp)/d)*sk;
    long long kd=(t-pp)%d;
    int ind=binarna(tvc,tvc+vc-1,kd+curt);
    tres+=pc[ind]-curl;
    res=max(res,tres);
    for(int i=0;i<g[s].size();i++) if(!c[g[s][i]]) dfs(g[s][i],sm+lp[g[s][i]],pp+w[s][i]);
}
int main()
{
    scanf("%d%lld",&n,&t);
    for(int i=1;i<=n;i++) scanf("%lld",&lp[i]);
    for(int i=1;i<=n;i++) scanf("%d",&inv[i]);
    for(int i=1;i<=n;i++) scanf("%lld",&tg[i]);
    for(int i=1;i<=n;i++) {g[inv[i]].push_back(i); w[inv[i]].push_back(tg[i]);}
    fill(c,c+MAXN,true);
    topo();
    for(int i=1;i<=n;i++) if(c[i] && !vi[i])
    {
        nz.clear(); pc.clear();
        int tr=i; curt=0; x=0; vc=0; d=0; sk=0; tvc=0; curl=0;
        while(true) {nz.push_back(d); vc++; d+=tg[tr]; tr=inv[tr]; pc.push_back(sk); sk+=lp[tr]; if(i==tr) break;}
        while(true)
        {
            vi[tr]=true;
            dfs(tr,lp[tr],0LL);
            pc.push_back(sk+curl);
            nz.push_back(d+curt);
            curt+=tg[tr];
            tvc++;
            tr=inv[tr];
            curl+=lp[tr];
            if(i==tr) break;
        }
    }
    printf("%lld",res);
    return 0;
}