#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;
long long ciklusv,ciklust,ciklusv1[MAXN],ciklust1[MAXN];
bool obidjeno[MAXN],ciklusi[MAXN];

void resetuj(){
     for(int i=1;i<=n;i++){
        obidjeno[i]=false;
     }
}
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){
    long long pom=0;
    if(ciklusi[c]){
        pom = (s/ciklust1[c])*ciklusv1[c];
        s=s%ciklust1[c];
    }
    if(s<d[c])
        return a[c]+pom;
    return a[c]+pom+(long long)putdo(x[c],s-d[c]);
}

bool krug(int i, int c){
    if(obidjeno[i])
        return false;
    obidjeno[i]=true;
    ciklusv+=a[i];
    ciklust+=d[i];
    if(i==c)
        return true;
    return krug(x[i],c);
}

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;*/
    res1=0;
    for(int i=1;i<=n;i++){
        resetuj();
        ciklust=ciklusv=0;
        if(!krug(x[i],i)){
            ciklusi[i]=false;
            continue;
        }
        ciklusi[i]=true;
        ciklusv1[i]=ciklusv;
        ciklust1[i]=ciklust;
    }
    for(int i=1;i<=n;i++){
        long long pom = putdo(i,t);
        if(pom>res1)
            res1=pom;
       // cout<<i<<" "<<pom<<endl;
    }
    res+=res1;

}
void pisi(){
    cout<<res;
}
int main()
{
    citaj();
    //krug(x[1],1);
    radi1();
    pisi();
    return 0;
}
/*
5 7
7 3 1 4 8
4 3 5 2 1
3 2 4 1 7
*/