#include <iostream>
#include <stdio.h>
#include <vector>

#define MAXN 100005

using namespace std;

int n,x[MAXN],d[MAXN],s[MAXN];
int kont[MAXN],brk=0;
long long t,t1;

void unos()
{
    scanf("%d %lld",&n,&t);
    for(int i=1;i<=n;i++)
        scanf("%d",&s[i]);
    for(int i=1;i<=n;i++)
        scanf("%d",&x[i]);
    for(int i=1;i<=n;i++)
        scanf("%d",&d[i]);
}

void konture()
{
    int j;
    for(int i=1;i<=n;i++)
        if(!kont[i]){
            brk++;
            kont[i]=brk;
            j=i;
            do
            {
                kont[j]=brk;
                j=x[j];
            }while(j!=i);
        }
}

long long lepota(int brkk)
{
    int tc,tc1;
    for(tc=1;tc<=n;tc++)
        if(kont[tc]=brkk)
            break;
    tc1=tc;
    long long r=0,mog=t;
    while(true)
    {
        //cout<<tc<<endl;
        r+=s[tc];
        if(d[tc]<=mog)
        {
            mog-=d[tc];
            tc=x[tc];
        }
        else
            return 0;
        if(tc==tc1)
            break;
    }
    return r;
}

long long duzina(int brkk)
{
    int tc,tc1;
    for(tc=1;tc<=n;tc++)
        if(kont[tc]=brkk)
            break;
    tc1=tc;
    long long r=0,mog=t;
    while(true)
    {
        //cout<<tc<<endl;
        if(d[tc]<=mog)
        {
            r+=d[tc];
            mog-=d[tc];
            tc=x[tc];
        }
        else
            return 0;
        if(tc==tc1)
            break;
    }
    return r;
}

long long pomocna2(int brkk)
{
    vector <int> v,v2;
    int tc=1,q;
    long long pr=t,parc,maxparc=0;
    for(;tc<=n;tc++)
        if(kont[tc]=brkk)
            break;
    q=tc;
    v.push_back(q);
    //v2.push_back(s[q]);
    //cout<<v.size();
    do
    {
        //cout<<q<<endl;
        q=x[q];
        if(q!=tc)
            v.push_back(q);
        //v2.push_back(s[q])
    }while(q!=tc);
    int m=v.size();
    //cout<<m<<endl;
    for(int i=0;i<m;i++){
        v.push_back(v[i]);
        //v2.push_back(v2[i]);
    }
    int i,j=0;
    parc=0;
    for(i=0;i<m;i++){
        //cout<<t1<<endl;
        while(d[v[j]]<=t1&&j<2*m)
        {
            parc+=s[v[j]];
            t1-=d[v[j]];
            j++;
        }
        //cout<<parc<<" "<<j<<endl;
        maxparc=max(parc,maxparc);
        parc-=s[v[i]];
        t1+=d[v[i]];
    }
    return maxparc;
}

void ispisk()
{
    for(int i=1;i<=n;i++)
        cout<<kont[i]<<" ";
}

void glavna()
{
    long long m,ma=0,m2;
    long long r;
    konture();
    //ispisk();
    for(int i=1;i<=brk;i++)
    {
        r=0;
        m=lepota(i);
        m2=duzina(i);
        //cout<<m2<<endl;
        if(m!=0){
            r+=t/m2*m;
            t1=t%m2;
        }
        else
            t1=t;
        r+=pomocna2(i);
        ma=max(r,ma);
    }
    cout<<ma;
}

int main()
{
    unos();
    glavna();

    return 0;
}