#include <bits/stdc++.h>
#define MAXN 100100

using namespace std;

long long x[MAXN],d[MAXN],a[MAXN];
long long n,t,res,res1;
int tren;
long long temp;
long long put;
bool obidjeno[MAXN];

void citaj(){
    cin>>n>>t;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=n;i++){
        cin>>x[i];
    }
    for(int i=1;i<=n;i++){
        cin>>d[i];
    }
}

long long putdo(int c,int s){
    if(s<d[c])
        return a[c];
    return a[c]+(long long)putdo(x[c],s-d[c]);
}

void putt(int c){
    tren=c;
    temp+=a[c];
    if(put + d[c]>t){
        return;
    }
    //cout<<c<<put<<endl;
    put+=d[c];

    putt(x[c]);
}
void radi4(){
    for(int j=1;j<=n;j++){
        if(obidjeno[j])
            continue;
        putt(j);
        obidjeno[j]=true;
        long long i=j;
        while(tren!=j){
            if(temp>res)
                res=temp;
            //cout<<i<<"-"<<tren<<":"<<temp<<endl;
            put-=d[i];
            temp-=a[i];
            temp-=a[tren];
            i=x[i];
            obidjeno[i]=true;
            putt(tren);
        }
        if(temp>res)
            res=temp;
    }

}
void radi1(){
   /* for(int i=1;i<=n;i++){
        ciklus+=(long long)a[i];
    }
    for(int i=1;i<=n;i++){
        duzina+=(long long)d[i];
    }
    res=ciklus*(t/duzina);
    t=t%duzina;*/
    for(int i=1;i<=n;i++){
        long long pom= putdo(i,t);
        if(pom>res1)
            res1=pom;
    }
    res+=res1;

}
void pisi(){
    cout<<res;
}
int main()
{
    citaj();
    if(t<=1000)
        radi1();
    else
        radi4();
    pisi();
    return 0;
}
/*
5 7
7 3 1 4 8
4 3 5 2 1
3 2 4 1 7
*/