#include <bits/stdc++.h>   using namespace std;   using ll = long long;   const int MXN = 3e5 + 5;   const int MOD = 998244353;   const int LOG = 19;   int add(int x, int y) { return (x += y) < MOD ? x : x - MOD; }   int sub(int x, int y) { return (x -= y) >= 00 ? x : x + MOD; }   int mul(int x, int y) { return (ll)x * y % MOD; }   int pwr(int x, int p) {     if (p == 0) return 1;     if (p % 2) return mul(x, pwr(x, p - 1));     return pwr(mul(x, x), p / 2);   }   int inv(int x) { return pwr(x, MOD - 2); }   int sol = 1;   int ok[MXN];   int val[MXN];   int dep[MXN];   int lca[MXN];   int nxt[MXN];   int dp[MXN][2];   int anc[MXN][LOG];   vector<int> adj[MXN];   int getlca(int x, int y) {     if (dep[x] < dep[y]) swap(x, y);     int diff = dep[x] - dep[y];     for (int i = 0; i < LOG; ++i) {       if (diff >> i & 1) x = anc[x][i];     }     if (x == y) return x;     for (int i = LOG - 1; i >= 0; --i) {       if (anc[x][i] != anc[y][i]) {         x = anc[x][i];         y = anc[y][i];       }     }     return anc[x][0];   }   void dfs1(int x, int p) {     if (val[x]) {       if (lca[val[x]]) {         lca[val[x]] = getlca(lca[val[x]], x);       } else {         lca[val[x]] = x;       }     }     for (int y : adj[x]) {       if (y == p) continue;       anc[y][0] = x;       dep[y] = dep[x] + 1;       for (int i = 0; i < LOG - 1; ++i) {         anc[y][i + 1] = anc[anc[y][i]][i];       }       dfs1(y, x);     }   }   void dfs2(int x, int p) {     vector<int> vec;     for (int y : adj[x]) {       if (y == p) continue;       dfs2(y, x);       if (ok[y]) {         ok[x] = 1;         vec.push_back(y);       }       if (val[y] && y != lca[val[y]]) {         if (val[x] && val[x] != val[y]) {           cout <<  0 n ;           exit(0);         }         val[x] = val[y];       }     }     if (val[x]) {       dp[x][0] = ok[x] = 1;       for (int y : vec) {         sol = mul(sol, add(mul(dp[y][0], nxt[y] + 1), dp[y][1]));       }     } else if (vec.size() > 1) {       dp[x][1] = 1;       for (int y : vec) {         int tmp = add(dp[y][1], mul(dp[y][0], nxt[y] + 1));         dp[x][1] = mul(dp[x][1], tmp);       }       for (int y : vec) {         int tmp = add(dp[y][1], mul(dp[y][0], nxt[y] + 1));         dp[x][0] = add(dp[x][0], mul(mul(dp[x][1], inv(tmp)), dp[y][0]));       }     } else if (vec.size() == 1) {       dp[x][0] = dp[vec[0]][0];       dp[x][1] = dp[vec[0]][1];       nxt[x] = nxt[vec[0]] + 1;     }   }   int main() {     ios::sync_with_stdio(0), cin.tie(0);     int n, k;     cin >> n >> k;     for (int i = 1; i <= n; ++i) {       cin >> val[i];     }     for (int i = 2; i <= n; ++i) {       int x, y;       cin >> x >> y;       adj[x].push_back(y);       adj[y].push_back(x);     }     dfs1(1, 0);     dfs2(1, 0);     if (dp[1][0]) sol = mul(sol, dp[1][0]);     cout << sol <<   n ;   }   