//A "vallalat" feladat hivatalos megoldasa
#include <iostream>
#include <vector>

using namespace std;

int n,m;
vector<int> g[5001],h[5001]; //az i-edik pont szomszedai (g: elso, h: masodik fa)
int f,v[5000];

int dp[5001][5001];
//dp[i][j] = az elso fa i-edik pontjabol indulo reszfa atalakitasi koltsege a masodik fa j-edik pontjabol indulo reszfaba
//0-tol indexelve, N-edik pont es M-edik pont: fiktiv pontok - ures fa

int dfs(int p, int q) {
    if(dp[p][q] >= 0) return dp[p][q];
    if((p==n) && (q==m)) return dp[p][q] = 0; //mindketto ures -- elso eset

    //masodik eset
    int kolt = 1000000001; //vegtelen: > N*szumma(v[i])+M*F >= 2*5000*10^5 = 10^9
    //ket lehetoseg a gyerekekre: (bal-bal, jobb-jobb) vagy (bal-jobb, jobb-bal)
    for(int i=0; i<2; i++) {
        int k(0);
        k += dfs(g[p][0],h[q][i]);
        k += dfs(g[p][1],h[q][1-i]);
        kolt = min(kolt,k);
    }

    if(p==n) {
        //p ures -> mindenkepp fel kell venni a q-adikat
        kolt += f;
    } else if(q==m) {
        //q ures -> mindenkepp ki kell rugni a p-ediket
        kolt += v[p];
    }

    return (dp[p][q] = kolt);
}

int main()
{
    //beolvasas (0-tol indexelve)
    cin >> n >> f;
    for(int i=0; i<n; i++) cin >> v[i];
    for(int i=1; i<n; i++) {
        int x; cin >> x; x--;
        g[x].push_back(i);
    }

    cin >> m;
    for(int i=1; i<m; i++) {
        int x; cin >> x; x--;
        h[x].push_back(i);
    }

    //leegyszerusites egy fajta esetre: minden pontnak legyen pontosan 2 gyereke
    for(int p=0; p<=n; p++) {
        while(g[p].size()<2) g[p].push_back(n);
    }
    for(int q=0; q<=m; q++) {
        while(h[q].size()<2) h[q].push_back(m);
    }

    for(int i=0; i<=n; i++) {
        for(int j=0; j<=m; j++) {
            dp[i][j] = -1; //-1: "meg nincs kiszamolva"
        }
    }

    cout << dfs(0,0) << endl;

    return 0;
}
