#include <iostream>
#include <vector>

using namespace std;

long long dynmat[1007][1007];
long long val[100007];
long long tempputevi[100007];
int boja[100007]={0};
vector<pair<int,int>> putevi;
long long n,t;

long long safe_acess(int x,int y)
{
    long long a=0;
    if(x>=0 && y>=0 && x<n && y<t){a=dynmat[x][y];}
    return a;
}

int main()
{
    cin>>n>>t;
    if(n>1000 || t>1000)
    {
        putevi.resize(n);
        for(int i=0;i<n;i++)
        {
            cin>>val[i];
        }
        for(int i=0;i<n;i++)
        {
            cin>>tempputevi[i];
        }
        for(int i=0;i<n;i++)
        {
            long long x;
            cin>>x;
            putevi[i]=make_pair(tempputevi[i]-1,x);
        }
        long long res1=0,res2=0,tres2=0,tcost2=0,l=0,d=0,brs=0;
        long long ciklrep=0;
        long long ciklcost=0;
        int cboja=0;
        for(int i=0;i<n;i++)
        {
            if(boja[i]==0){
                cboja++;
                long long tciklrep=i;
                long long tciklval=val[tciklrep];
                long long tciklcost=0;
                long long tres1=0;
                boja[tciklrep]=cboja;
                while(boja[putevi[tciklrep].first]==0)
                {
                    tciklval+=val[putevi[tciklrep].first];
                    tciklcost+=putevi[tciklrep].second;
                    tciklrep=putevi[tciklrep].first;
                    boja[tciklrep]=cboja;
//                    cout<<"RUNNING:"<<tciklrep<<" "<<tciklcost<<endl;
                }
                tciklcost+=putevi[tciklrep].second;
                tres1=(t/tciklcost)*tciklval;
                if(tres1>res1){res1=tres1;ciklrep=tciklrep;ciklcost=tciklcost;}
            }
        }
//        cout<<res1<<endl;
//        cout<<ciklrep<<endl;
//        cout<<ciklcost<<endl;
        tres2=val[ciklrep];
        res2=val[ciklrep];
        l=ciklrep;
        d=ciklrep;
        while(brs<2*n)
        {
            brs++;
            tres2+=val[putevi[d].first];
            tcost2+=putevi[d].second;
            d=putevi[d].first;
            while(tcost2>t%ciklcost)
            {
                tres2-=val[l];
                tcost2-=putevi[l].second;
                l=putevi[l].first;
            }
            if(tres2>res2){res2=tres2;}
        }
        cout<<res1+res2;
//        for(int i=0;i<n;i++)
//        {
//            cout<<boja[i]<<" ";
//        }
    }
    else
    {
        putevi.resize(n);
        for(int i=0;i<n;i++)
        {
            cin>>val[i];
        }
        for(int i=0;i<n;i++)
        {
            cin>>tempputevi[i];
        }
        for(int i=0;i<n;i++)
        {
            long long x;
            cin>>x;
            putevi[i]=make_pair(tempputevi[i]-1,x);
        }
        for(int j=0;j<=t;j++)
        {
            for(int i=0;i<n;i++)
            {
                dynmat[i][j]=val[i]+safe_acess(putevi[i].first,j-putevi[i].second);
            }
        }
        //    cout<<endl;
        //    for(int i=0;i<=t;i++)
        //    {
        //        for(int j=0;j<n;j++)
        //        {
        //            cout<<dynmat[j][i]<<" ";
        //        }
        //        cout<<endl;
        //    }
        int maxv=dynmat[0][t];
        for(int i=1;i<n;i++)
        {
            if(dynmat[i][t]>maxv){maxv=dynmat[i][t];}
        }
        cout<<maxv;
    }
    return 0;
}