#include <bits/stdc++.h>
using namespace std;
const int N = 300069, mo = 998244353;
struct sumireko {
  int to, ne;
} e[N << 1];
int he[N], ecnt;
void addline(int f, int t) {
  e[++ecnt].to = t;
  e[ecnt].ne = he[f];
  he[f] = ecnt;
}
int a[N], ccnt[N], dp[N][2], tmp[N];
int n, m;
bool nope;
int sta[N], pre[N] = {1}, stp;
void dfs(int x, int f) {
  bool isl = 0;
  if (a[x]) tmp[x]++;
  for (int i = he[x], t = e[i].to; i; i = e[i].ne, t = e[i].to) {
    if (t == f) continue;
    isl = 1, dfs(t, x);
    if (!a[x])
      a[x] = a[t];
    else if (a[t] && a[x] != a[t])
      nope = 1;
    tmp[x] += tmp[t];
  }
  stp = 0;
  for (int i = he[x], t = e[i].to; i; i = e[i].ne, t = e[i].to)
    if (t != f)
      sta[++stp] = t,
      pre[stp] = 1ll * (dp[t][0] + dp[t][1]) * pre[stp - 1] % mo;
  if (!isl) {
    a[x] ? dp[x][1] = 1 : dp[x][0] = 1;
    if (tmp[x] == ccnt[a[x]]) a[x] = tmp[x] = 0;
    return;
  }
  if (a[x])
    dp[x][1] = pre[stp];
  else {
    dp[x][0] = pre[stp];
    int suf = 1;
    for (int i = stp; i; i--) {
      int t = sta[i];
      dp[x][1] = (dp[x][1] + 1ll * suf * dp[t][1] % mo * pre[i - 1] % mo) % mo;
      suf = 1ll * suf * (dp[t][0] + dp[t][1]) % mo;
    }
  }
  if (tmp[x] == ccnt[a[x]]) a[x] = tmp[x] = 0;
}
int xi, yi;
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]), ccnt[a[i]]++;
  for (int i = 1; i < n; i++)
    scanf("%d%d", &xi, &yi), addline(xi, yi), addline(yi, xi);
  dfs(1, 0);
  printf("%d", nope ? 0 : dp[1][1]);
  return 0;
}
