#include <bits/stdc++.h>
using namespace std;
const int MAXN = 3e5 + 5;
const long long MOD = 998244353;
int n, k, num[MAXN], c[MAXN], cnt, cnt2, nex[2 * MAXN], son[2 * MAXN],
    head[MAXN], in[MAXN];
long long ppp[MAXN], ans = 1;
vector<int> G[MAXN];
int cmp(int x, int y) { return c[x] > c[y]; }
struct lll {
  int cc, nn;
  long long num1, num2;
  int ttt;
};
void add(int x, int y) {
  son[++cnt] = y;
  nex[cnt] = head[x];
  head[x] = cnt;
  in[x]++;
}
long long mypow(long long a, long long e) {
  long long ans = 1, base = a;
  while (e) {
    if (e % 2) ans = ans * base % MOD;
    base = base * base % MOD;
    e /= 2;
  }
  return ans;
}
lll dfs(int x, int fa) {
  lll now;
  now.cc = c[x];
  now.nn = 1;
  now.ttt = c[x] ? 1 : 0;
  now.num1 = 0;
  now.num2 = 1;
  long long sig = 1, sig2 = 0;
  int nuu = 0;
  long long nuuu = 0;
  for (int i = 0; i < G[x].size(); i++) {
    int u = G[x][i];
    if (u == fa) continue;
    lll p = dfs(u, x);
    if (!p.ttt) continue;
    now.ttt = 1;
    if (p.cc) {
      if (p.nn < num[p.cc]) {
        if (p.cc == now.cc) {
          now.nn += p.nn;
        } else {
          if (now.cc) {
            printf("0\n");
            exit(0);
          } else {
            now.cc = p.cc;
            now.nn = p.nn;
            ans = ans * now.num2 % MOD;
          }
        }
      } else {
        nuuu++;
      }
    } else {
      if (now.cc) {
        ans = ans * (p.num2 + p.num1) % MOD;
      } else {
        nuu++;
        now.num1 = p.num1;
        sig2 = (sig2 + p.num1 * mypow(p.num2 + p.num1, MOD - 2)) % MOD;
        now.num2 = now.num2 * (p.num2 + p.num1) % MOD;
      }
    }
  }
  if (nuu >= 2) {
    now.num1 = now.num2 * sig2 % MOD;
  }
  if (nuuu) now.num1 = (now.num1 + now.num2 * nuuu) % MOD;
  return now;
}
int main() {
  scanf("%d%d", &n, &k);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &c[i]);
    if (c[i]) num[c[i]]++;
  }
  for (int i = 1; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    G[x].push_back(y);
    G[y].push_back(x);
  }
  for (int i = 1; i <= n; i++) sort(G[i].begin(), G[i].end());
  for (int i = 1; i <= n; i++) {
    if (c[i]) {
      dfs(i, 0);
      break;
    }
  }
  printf("%lld\n", ans);
  return 0;
}
