#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
#define MAXN 100005
int a[MAXN];
int X[MAXN];
int D[MAXN];
vector <int> g[MAXN];
int gde[MAXN];//kojoj scc komponenti pripada
bool bio[MAXN];
int in[MAXN];
int n;
ll t;
void ulaz()
{
    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];
    for(int i = 1; i <= n; i++)g[X[i]].push_back(i);
}

stack <int> stek;
int komp=0;
vector <int> sve[MAXN];

int cena[MAXN];//koliko vremena treba za ciklus
int vrednost[MAXN];//koliko dobijamo za taj ciklus

void dfs(int v)
{
    bio[v]=1;
    stek.push(v);
    for(auto x:g[v])
    {
        if(bio[x])
        {
            //CIKLUS
            while(stek.size())
            {
                int y = stek.top();
                stek.pop();
                sve[komp].push_back(y);
                gde[y]=komp;
                cena[komp]+=D[y];
                vrednost[komp]+=a[y];
                if(y==x){komp++;break;}
            }
        }
        else dfs(x);
    }
}


void scc()
{
    for(int i = 1; i <= n; i++)
    {
        if(!bio[i])
        {
            dfs(i);
            while(stek.size())
            {
                int y = stek.top();
                sve[komp].push_back(stek.top());
                stek.pop();
                cena[komp]=D[y];
                vrednost[komp]=a[y];
                komp++;
            }
        }
    }
}
vector <int> stablo_g[MAXN];//stablo je indeksirano od nule
void pravi_stablo()
{
    for(int i = 1; i <= n; i++)
    {
        if(gde[i]!=gde[X[i]])
        {
            stablo_g[gde[X[i]]].push_back(gde[i]);
            in[gde[i]]++;
        }
    }
}

typedef pair<ll,ll> pll;

ll depth[MAXN];
ll sumagore[MAXN];
vector <pll> pom;

void dfs2(int v)
{
    for(auto x:stablo_g[v])
    {
        depth[x]=depth[v]+cena[x];
        sumagore[x]=sumagore[v]+vrednost[x];
        pom.push_back({depth[x],sumagore[x]});
        dfs2(x);
    }
}

void kreni_dfs()
{
    ll ret=0LL;
    for(int i = 0; i < komp; i++)
    {
        if(in[i]==0)
        {
            ll s = (t/cena[i])*vrednost[i];
            pom.clear();
            depth[i]=0;
            dfs2(i);
            for(auto y:pom)
            {
                if(y.second <= (t%cena[i]))ret += y.first;
            }
            ret=max(ret,s);
        }
    }
    cout << ret;
}

int main()
{
    ios_base::sync_with_stdio(false);
    ulaz();
    scc();
    pravi_stablo();
    return 0;
}