void dfs(int cur, int root, int w, int t){
w += W[cur];
t += T[cur];
bags[root].push_back({w, t});
for(auto nxt: links[cur]) dfs(nxt, root, w, t);
}
void solve(){
cin >> N >> S;
rep(i, 1, N+1) cin >> W[i];
rep(i, 1, N+1) cin >> T[i];
rep(i, 1, N+1){
int p; cin >> p;
links[p].push_back(i);
}
for(auto nxt: links[0]) dfs(nxt, nxt, 0, 0);
rep(i, 0, N+2) rep(j, 0, S+1) KS[i][j] = 1e9;
KS[0][0] = 0;
rep(i, 0, N+1) rep(j, 0, S+1) {
KS[i+1][j] = min(KS[i+1][j], KS[i][j]);
for(auto [w, t]: bags[i]){
int nxt = min(S, j + w);
// }
KS[i+1][nxt] = min(KS[i+1][nxt], KS[i][j] + t);
}
}
if(KS[N+1][S] == 1e9) cout << -1;
else cout << KS[N+1][S];
}