#include <cstdio>
#define MAXN 10007
// #define DEBUG

/*
5 7
7 3 1 4 8
4 3 5 2 1
3 2 4 1 7
*/

using namespace std;

int O[MAXN];
// X[i] je pocetna pozicija puta koji se zavrsava u i.
int X[MAXN];
// Y[i] je krajnja pozicija puta koji pocinje u i.
int Y[MAXN];
// D[i] je duzina puta koji se zavrsava u i.
int D[MAXN];
// D2[i] je duzina puta koji pocinje u i.
int D2[MAXN];

int main() {
    // Input.
    int N, T, ukupnaLepota = 0, ukupnaDuzina = 0;
    scanf("%d %d", &N, &T);
    for (int i = 1; i <= N; ++i) {
        scanf("%d", &O[i]);
        ukupnaLepota += O[i];
    }
    for (int i = 1; i <= N; ++i) {
        scanf("%d", &X[i]);
        Y[X[i]] = i;
    }
    for (int i = 1; i <= N; ++i) {
        scanf("%d", &D[i]);
        D2[X[i]] = D[i];
        ukupnaDuzina += D[i];
    }
    #ifdef DEBUG
    for (int i = 1; i <= N; ++i) {
        printf("%d %d %d %d %d\n", O[i], X[i], Y[i], D[i], D2[i]);
    }
    #endif
    // Loop.
    int preostalo = T % ukupnaDuzina,
        krugova = T / ukupnaDuzina,
        maxLepota = 0;
    for (int i = 1; i <= N; ++i) {
        int tpreostalo = preostalo,
            trenutni = i,
            trenutnaLepota = 0;
        while (tpreostalo >= 0) {
            trenutnaLepota += O[trenutni];
            tpreostalo -= D2[trenutni];
            trenutni = Y[trenutni];
        }
        if (trenutnaLepota > maxLepota) {
            maxLepota = trenutnaLepota;
        }
    }
    printf("%d", krugova * ukupnaLepota + maxLepota);
    return 0;
}