#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;
}