#include <iostream>
#include <vector>

using namespace std;

vector<pair<int, int> > adj[1002];

int grades[1002];

int maxlepota = 0;

void pretraz(int lepota, long long int vreme, int cvor, int n, long long int t){

    if (vreme <= t){
        //cout << "Vreme jos nije isteklo. Max lepota je " << maxlepota << " a trenutna ovde je " << lepota << ". Trenutni cvor je " << cvor << "\n";
        if (lepota > maxlepota){
            maxlepota = lepota;
        }

        for(int i = 0; i < adj[cvor].size(); i++){
            pretraz(lepota + grades[adj[cvor][i].first], vreme + adj[cvor][i].second, adj[cvor][i].first, n, t);
        }
    }

}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cerr.tie(0);

    //kucaj ovdekaj

    //jednosmerno: znaci bice tipa topolosko neko djubre? weighted?

    int n;

    long long int t; // t = max distance

    cin >> n >> t;

    for (int i = 0; i < n; i++){
        cin >> grades[i];
    }
    int x[n];
    int d[n];
    for (int i = 0; i < n; i++){
        cin >> x[i];
    }
    for (int i = 0; i < n; i++){
        cin >> d[i];
    }
    for (int i = 0; i < n; i++){
        adj[x[i]-1].push_back({i,d[i]});
    }

    for (int i = 0; i < n; i++){
        pretraz(grades[i], 0, i, n, t);
    }

    cout << maxlepota;

    return 0;
}