#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pii> vii;
typedef vector<pll> vll;
#define ordered_set tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>
#define ordered_multiset tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update>
#define all(x) (x).begin(),(x).end()
#define pb push_back
#define ff first
#define ss second
#define mp make_pair
const int N = 5e3 + 1;
const int K = 6;
const int mod = 998244353;
int n, k;
vi graf[N], c;
int ile[1 << K], podd[N], dp[N][1 << K], pom[1 << K];
void dfs(int v, int ojc){
podd[v] = 1;
dp[v][0] = 1;
for(int u : graf[v]){
if(u == ojc) continue;
dfs(u, v);
for(int mask = 0; mask < (1 << k); mask++) pom[mask] = 0;
for(int mask = 0; mask < (1 << k); mask++){
for(int sub = mask;; sub = (sub - 1) & mask){
int a = mask ^ sub;
if(dp[v][a] && dp[u][sub]){
pom[mask] = (pom[mask] + 1LL * dp[v][a] * dp[u][sub]) % mod;
for(int i = 1; i <= k; i++){
int bit = 1 << (i - 1);
if(mask & bit) continue;
int roz = podd[u] - ile[sub & (bit | (bit - 1))];
if(bit > a && roz == c[i] && __builtin_popcount(sub >> i) == k - i){
pom[mask | bit] = (pom[mask | bit] + 1LL * dp[v][a] * dp[u][sub]) % mod;
}
if(bit > sub && roz == ile[bit]){
pom[mask | bit] = (pom[mask | bit] + 1LL * dp[v][a] * dp[u][sub]) % mod;
}
}
}
if(sub == 0) break;
}
}
podd[v] += podd[u];
for(int mask = 0; mask < (1 << k); mask++)
dp[v][mask] = pom[mask];
}
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for(int i = 1; i < n; i++){
int a, b;
cin >> a >> b;
graf[a].push_back(b);
graf[b].push_back(a);
}
cin >> k;
c.resize(k + 1);
c[0] = n;
for(int i = 1; i <= k; i++) cin >> c[i];
for(int mask = 0; mask < (1 << k); mask++){
for(int i = 1; i <= k; i++){
if(mask & (1 << (i - 1))) ile[mask] += c[i - 1] - c[i];
}
}
dfs(1, 0);
cout << dp[1][(1 << k) - 1] << "\n";
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2luY2x1ZGUgPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPgojaW5jbHVkZSA8ZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdXNpbmcgbmFtZXNwYWNlIF9fZ251X3BiZHM7CnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIGxvbmcgZG91YmxlIGxkOwp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IHBpaTsKdHlwZWRlZiBwYWlyPGxsLCBsbD4gcGxsOwp0eXBlZGVmIHZlY3RvcjxpbnQ+IHZpOwp0eXBlZGVmIHZlY3RvcjxsbD4gdmw7CnR5cGVkZWYgdmVjdG9yPHBpaT4gdmlpOwp0eXBlZGVmIHZlY3RvcjxwbGw+IHZsbDsKI2RlZmluZSBvcmRlcmVkX3NldCB0cmVlPGludCwgbnVsbF90eXBlLCBsZXNzPGludD4sIHJiX3RyZWVfdGFnLCB0cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGU+CiNkZWZpbmUgb3JkZXJlZF9tdWx0aXNldCB0cmVlPGludCwgbnVsbF90eXBlLCBsZXNzX2VxdWFsPGludD4sIHJiX3RyZWVfdGFnLCB0cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGU+CiNkZWZpbmUgYWxsKHgpICh4KS5iZWdpbigpLCh4KS5lbmQoKQojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGZmIGZpcnN0CiNkZWZpbmUgc3Mgc2Vjb25kCiNkZWZpbmUgbXAgbWFrZV9wYWlyCmNvbnN0IGludCBOID0gNWUzICsgMTsKY29uc3QgaW50IEsgPSA2Owpjb25zdCBpbnQgbW9kID0gOTk4MjQ0MzUzOwoKaW50IG4sIGs7CnZpIGdyYWZbTl0sIGM7CmludCBpbGVbMSA8PCBLXSwgcG9kZFtOXSwgZHBbTl1bMSA8PCBLXSwgcG9tWzEgPDwgS107Cgp2b2lkIGRmcyhpbnQgdiwgaW50IG9qYyl7CiAgICBwb2RkW3ZdID0gMTsKICAgIGRwW3ZdWzBdID0gMTsKCiAgICBmb3IoaW50IHUgOiBncmFmW3ZdKXsKICAgICAgICBpZih1ID09IG9qYykgY29udGludWU7CgogICAgICAgIGRmcyh1LCB2KTsKCiAgICAgICAgZm9yKGludCBtYXNrID0gMDsgbWFzayA8ICgxIDw8IGspOyBtYXNrKyspIHBvbVttYXNrXSA9IDA7CgogICAgICAgIGZvcihpbnQgbWFzayA9IDA7IG1hc2sgPCAoMSA8PCBrKTsgbWFzaysrKXsKICAgICAgICAgICAgZm9yKGludCBzdWIgPSBtYXNrOzsgc3ViID0gKHN1YiAtIDEpICYgbWFzayl7CiAgICAgICAgICAgICAgICBpbnQgYSA9IG1hc2sgXiBzdWI7CiAgICAgICAgICAgICAgICBpZihkcFt2XVthXSAmJiBkcFt1XVtzdWJdKXsKICAgICAgICAgICAgICAgICAgICBwb21bbWFza10gPSAocG9tW21hc2tdICsgMUxMICogZHBbdl1bYV0gKiBkcFt1XVtzdWJdKSAlIG1vZDsKCiAgICAgICAgICAgICAgICAgICAgZm9yKGludCBpID0gMTsgaSA8PSBrOyBpKyspewogICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0ID0gMSA8PCAoaSAtIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBpZihtYXNrICYgYml0KSBjb250aW51ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3ogPSBwb2RkW3VdIC0gaWxlW3N1YiAmIChiaXQgfCAoYml0IC0gMSkpXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoYml0ID4gYSAmJiByb3ogPT0gY1tpXSAmJiBfX2J1aWx0aW5fcG9wY291bnQoc3ViID4+IGkpID09IGsgLSBpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbVttYXNrIHwgYml0XSA9IChwb21bbWFzayB8IGJpdF0gKyAxTEwgKiBkcFt2XVthXSAqIGRwW3VdW3N1Yl0pICUgbW9kOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZihiaXQgPiBzdWIgJiYgcm96ID09IGlsZVtiaXRdKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbVttYXNrIHwgYml0XSA9IChwb21bbWFzayB8IGJpdF0gKyAxTEwgKiBkcFt2XVthXSAqIGRwW3VdW3N1Yl0pICUgbW9kOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmKHN1YiA9PSAwKSBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcG9kZFt2XSArPSBwb2RkW3VdOwoKICAgICAgICBmb3IoaW50IG1hc2sgPSAwOyBtYXNrIDwgKDEgPDwgayk7IG1hc2srKykKICAgICAgICAgICAgZHBbdl1bbWFza10gPSBwb21bbWFza107CiAgICB9Cn0KCmludCBtYWluKCl7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZSgwKTsKCiAgICBjaW4gPj4gbjsKCiAgICBmb3IoaW50IGkgPSAxOyBpIDwgbjsgaSsrKXsKICAgICAgICBpbnQgYSwgYjsKICAgICAgICBjaW4gPj4gYSA+PiBiOwogICAgICAgIGdyYWZbYV0ucHVzaF9iYWNrKGIpOwogICAgICAgIGdyYWZbYl0ucHVzaF9iYWNrKGEpOwogICAgfQoKICAgIGNpbiA+PiBrOwoKICAgIGMucmVzaXplKGsgKyAxKTsKICAgIGNbMF0gPSBuOwoKICAgIGZvcihpbnQgaSA9IDE7IGkgPD0gazsgaSsrKSBjaW4gPj4gY1tpXTsKCiAgICBmb3IoaW50IG1hc2sgPSAwOyBtYXNrIDwgKDEgPDwgayk7IG1hc2srKyl7CiAgICAgICAgZm9yKGludCBpID0gMTsgaSA8PSBrOyBpKyspewogICAgICAgICAgICBpZihtYXNrICYgKDEgPDwgKGkgLSAxKSkpIGlsZVttYXNrXSArPSBjW2kgLSAxXSAtIGNbaV07CiAgICAgICAgfQogICAgfQoKICAgIGRmcygxLCAwKTsKICAgIGNvdXQgPDwgZHBbMV1bKDEgPDwgaykgLSAxXSA8PCAiXG4iOwoKICAgIHJldHVybiAwOwp9