#include <cstdio>
#include <iostream>
#include <vector>
#include <deque>
#include <utility>
#define MAXN 500005
#define MAXX 1000000009
using namespace std;
long long int d[1005][1005];
long long int a1[MAXN];
vector <vector <pair<int,long long int> > > m;
int h1[MAXN];
long long int h2[MAXN];
long long int uk=0LL;
bool bb[MAXN];
bool rt=false;
deque <pair <long long int ,long long int > > q;
int n;
long long int resi(int p , long long int t/*,long long int u*/)
{
    if (d[p][t]!=-1) return d[p][t];
    int i,j,k;
    long long int mx=0LL,mt=0LL;
    long long int u;
    u=a1[p];
    int br=m[p].end()-m[p].begin();
    for (i=0;i<br;i++)
    {
        if (m[p][i].second<=t)
        {
            mt=resi(m[p][i].first,t-m[p][i].second);
        }
        if (mt>mx) mx=mt;
    }
    u+=mx;
    d[p][t]=u;
    return u;
}
long long int resi1(int p,bool gg)
{

    int i,j,k;
   // int br=m[p].end()-m[p].begin();
     long long int u;
    u=a1[p];
    if (gg) bb[i]=true;
    gg=true;
    uk+=m[p][0].second;
    if (!bb[m[p][0].first]) u+=resi1(m[p][0].first,gg);
    return u;

}
long long int resi2(int p,int po,long long int dd,long long int t)
{
    int i,j,k;
    long long int u;
    long long int mx=0LL,mt=0LL;
    u=a1[p];
    q.push_front(make_pair(a1[p],m[p][0].second));
    if (p==po) rt=!rt;
    while(rt)
    {
        if (dd+m[p][0].second<=t){
            p=m[p][0].first;
            if (p==po) rt=!rt;
            dd+=m[p][0].second;
            q.push_front(make_pair(a1[p],m[p][0].second));
            u+=a1[p];


        }
        else
        {
            if (u>mx) mx=u;
            while (dd+m[p][0].second>t)
            {
                u-=q.back().first;
                dd-=q.back().second;
                q.pop_back();
            }
        }

    }

    return mx;


}
int main()
{
    int i,j,k;
    long long int t,a=0LL,b,c,dd;
    scanf("%d%lld",&n,&t);
    m.resize(n+1);
    if (n<=1000 && t<=1000)
    {
        for (i=0;i<n;i++)
        {
            for(j=0;j<=t;j++)
            {
                d[i][j]=-1;
            }
        }
        for (i=0;i<n;i++)
        {
            scanf("%lld",&a1[i]);
           // cin >> a[i];
        }
        for (i=0;i<n;i++)
        {
            scanf("%d",&h1[i]);
            //k--;
            //m[k].push_back(i);
        }
        for (i=0;i<n;i++)
        {
            scanf("%lld",&h2[i]);
        }
        for (i=0;i<n;i++)
        {
            m[h1[i]-1].push_back(make_pair(i,h2[i]));
        }
   /*     for (i=0;i<n;i++)
        {
            for (j=0;j<m[i].end()-m[i].begin();j++)
            cout << m[i][j].first << " " << m[i][j].second << "\n";
        }*/
        for (i=0;i<n;i++)
        {
            //printf("%lld\n",a);
            c=0LL;
            b=resi(i,t);
            if (b>a) a=b;
        }
        printf("%lld", a);
        return 0;
    }
    else
    {
        for (i=0;i<n;i++)
        {
            scanf("%lld",&a1[i]);
           // cin >> a[i];
        }
        for (i=0;i<n;i++)
        {
            scanf("%d",&h1[i]);
            //k--;
            //m[k].push_back(i);
        }
        for (i=0;i<n;i++)
        {
            scanf("%lld",&h2[i]);
        }
        for (i=0;i<n;i++)
        {
            m[h1[i]-1].push_back(make_pair(i,h2[i]));
        }
    for (i=0;i<n;i++) bb[i]=false;
    for (i=0;i<n;i++)
    {
        if (!bb[i])
        {
            q.clear();
            uk=0LL;
            b=0LL;
            b=resi1(i,false);
            c=b*(t/uk);
            t=t%uk;
            dd=0LL;
            c+=resi2(i,i,dd,t);
            if (c>a) a=c;
        }
    }
        printf("%lld",a);
    }
    return 0;
}