#include <bits/stdc++.h>
using std::cerr;
using std::endl;
const int N = 3e5 + 233, P = 998244353;
inline int fpow(int x, int y) {
  int ret = 1;
  for (; y; y >>= 1, x = 1ll * x * x % P)
    if (y & 1) ret = 1ll * ret * x % P;
  return ret;
}
int n, K, A[N];
std::vector<int> G[N];
int dfn[N], num, dad[N], bel[N], st[N], ed[N], dep[N], lca[N];
void dfs1(int x, int fa) {
  dfn[x] = ++num;
  dad[x] = fa;
  dep[x] = dep[fa] + 1;
  for (int y : G[x])
    if (y != fa) dfs1(y, x);
}
inline int get_lca(int x, int y, int c) {
  while (true) {
    if (dep[x] < dep[y]) std::swap(x, y);
    if (bel[x]) {
      if (bel[x] != c) {
        puts("0"), exit(0);
      }
      if (x == y) return x;
      return -1;
    }
    bel[x] = c;
    if (x == y) break;
    x = dad[x];
  }
  return x;
}
inline void check_ans() {
  dfs1(1, 0);
  for (int i = 1; i <= n; ++i) {
    if (!A[i]) continue;
    if (!st[A[i]]) st[A[i]] = ed[A[i]] = i;
    if (dfn[i] < dfn[st[A[i]]]) st[A[i]] = i;
    if (dfn[i] > dfn[ed[A[i]]]) ed[A[i]] = i;
  }
  for (int i = 1; i <= K; ++i) lca[i] = get_lca(st[i], ed[i], i);
  for (int i = 1; i <= n; ++i) {
    if (!A[i]) continue;
    if (bel[i] && bel[i] != A[i]) {
      puts("0"), exit(0);
    }
    get_lca(lca[A[i]], i, A[i]);
  }
}
int f[N][2];
void dfs2(int x) {
  for (int y : G[x])
    if (y != dad[x]) dfs2(y);
  if (!bel[x]) {
    f[x][0] = 1;
    for (int y : G[x])
      if (y != dad[x]) f[x][0] = 1ll * f[x][0] * (f[y][0] + f[y][1]) % P;
    for (int y : G[x])
      if (y != dad[x])
        f[x][1] = (f[x][1] + 1ll * f[y][1] * f[x][0] % P *
                                 fpow((f[y][0] + f[y][1]) % P, P - 2)) %
                  P;
  } else {
    f[x][0] = 0;
    f[x][1] = 1;
    for (int y : G[x])
      if (y != dad[x]) f[x][1] = 1ll * f[x][1] * (f[y][0] + f[y][1]) % P;
  }
}
inline void get_ans() {
  dfs2(1);
  std::cout << f[1][1] << std::endl;
}
int main() {
  std::ios::sync_with_stdio(0);
  std::cin.tie(0);
  std::cin >> n >> K;
  for (int i = 1; i <= n; ++i) std::cin >> A[i];
  for (int i = 1; i < n; ++i) {
    int x, y;
    std::cin >> x >> y;
    G[x].push_back(y);
    G[y].push_back(x);
  }
  check_ans();
  get_ans();
  return 0;
}
