#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M = 1e5 + 10;
int n, m, k, p[M], q[M], sz[M];
ll mod, cntP, cntQ, newcntP, newcntQ, P, Q, newP, newQ, SP, SQ, newSP, newSQ, ans;
vector <int> adj[M];

void dosize(int r, int x) {
    sz[x] = 1;
    for (int v : adj[x]) {
        if (v != r && sz[v] >= 0) {
            dosize(x, v);
            sz[x] += sz[v];
        }
    }
}

int centroid(int r, int x, int t) {
    for (int v : adj[x]) {
        if (v != r && sz[v] > t) {
            return centroid(x, v, t);
        }
    }
    return x;
}

void dfs(int r, int x, int h) {
    if (p[x]) {
        newcntP++;
        newP += h, newP %= mod;
        newSP += (ll)h * h, newSP %= mod;
    }
    if (q[x]) {
        newcntQ++;
        newQ += h, newQ %= mod;
        newSQ += (ll)h * h, newSQ %= mod;
    }
    for (int v : adj[x]) {
        if (v != r && sz[v] >= 0) {
            dfs(x, v, h + 1);
        }
    }
}

void dnc(int x) {
    dosize(x, x);
    x = centroid(x, x, sz[x] >> 1);
    cntP = p[x], cntQ = q[x];
    for (int v : adj[x]) {
        if (sz[v] < 0) continue;
        dfs(x, v, 1);
        ans += cntQ * newSP + cntP * newSQ, ans %= mod;
        ans += newcntP * SQ + newcntQ * SP, ans %= mod;
        ans += 2 * newP * Q + 2 * newQ * P, ans %= mod;
        cntP += newcntP, cntQ += newcntQ, P += newP, Q += newQ, SP += newSP, SQ += newSQ;
        cntP %= mod, cntQ %= mod, P %= mod, Q %= mod, SP %= mod, SQ %= mod;
        newcntP = newcntQ = newP = newQ = newSP = newSQ = 0;
    } cntP = cntQ = P = Q = SP = SQ = 0, sz[x] = -1;
    for (int v : adj[x]) {
        if (sz[v] >= 0) {
            dnc(v);
        }
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL), cout.tie(NULL);
    freopen(".2.in","r",stdin);
    cin >> n >> m >> k >> mod;
    for (int i = 1; i < n; i++) {
        int a, b; cin >> a >> b;
        adj[a].push_back(b), adj[b].push_back(a);
    }
    while (m--) {
        int x; cin >> x; p[x] = 1;
    }
    while (k--) {
        int x; cin >> x; q[x] = 1;
    } dnc(1);
    cout << ans << "\n";
    return 0;
}
