#include <bits/stdc++.h>
using namespace std;
const long double EPS = 1e-9, PI = acos(-1.);
const int INF = 0x3f3f3f3f, MOD = 998244353;
const int N = 3e5 + 5, M = 25;
int n, k;
int c[N], vis[N];
int cnt[N][3];
vector<int> clist[N];
vector<int> adj[N];
int ans;
int anc[M][N];
int h[N], rt;
long long dp[N][2];
void dfs1(int u) {
  for (int v : adj[u])
    if (v != anc[0][u]) {
      anc[0][v] = u;
      h[v] = h[u] + 1;
      dfs1(v);
    }
}
int lca(int u, int v) {
  if (h[u] < h[v]) swap(u, v);
  for (int i = M - 1; i >= 0; i--)
    if (h[u] - (1 << i) >= h[v]) u = anc[i][u];
  if (u == v) return u;
  for (int i = M - 1; i >= 0; i--)
    if (anc[i][u] != anc[i][v]) u = anc[i][u], v = anc[i][v];
  return anc[0][u];
}
bool unite(int u, int p) {
  if (c[u] == c[p]) return true;
  if (c[u] == 0) c[u] = c[p];
  if (c[u] != c[p]) return false;
  for (int v : adj[u])
    if (v != anc[0][u]) adj[p].push_back(v);
  return unite(anc[0][u], p);
}
long long fexp(long long a, long long b) {
  long long r = 1;
  for (a %= MOD; b; b >>= 1, a = (a * a) % MOD)
    if (b & 1) r = (r * a) % MOD;
  return r;
}
long long inv(long long a) { return fexp(a, MOD - 2); }
long long mul(long long a, long long b) { return (a * b) % MOD; }
long long sum(long long a, long long b) {
  long long ans = a + b;
  if (ans < 0) ans += MOD;
  if (ans >= MOD) ans -= MOD;
  return ans;
}
long long divi(long long a, long long b) { return mul(a, inv(b)); }
void dfs2(int u) {
  dp[u][0] = 1;
  for (int v : adj[u])
    if (v != anc[0][u] and (c[u] == 0 or c[v] != c[u])) {
      dfs2(v);
      dp[u][0] = mul(dp[u][0], sum(dp[v][0], dp[v][1]));
    }
  if (c[u] != 0) {
    dp[u][1] = dp[u][0];
    dp[u][0] = 0;
    return;
  }
  for (int v : adj[u])
    if (v != anc[0][u] and (c[u] == 0 or c[v] != c[u])) {
      dp[u][1] =
          sum(dp[u][1], mul(divi(dp[u][0], sum(dp[v][0], dp[v][1])), dp[v][1]));
    }
}
int main() {
  scanf("%d%d", &n, &k);
  for (int i = 1; i <= n; i++)
    scanf("%d", &c[i]), cnt[0][c[i]]++, clist[c[i]].push_back(i);
  for (int i = 1; i < n; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    adj[a].push_back(b);
    adj[b].push_back(a);
  }
  anc[0][1] = 1;
  h[1] = 0;
  dfs1(1);
  for (int i = 1; i < M; i++)
    for (int j = 1; j <= n; j++) anc[i][j] = anc[i - 1][anc[i - 1][j]];
  for (int i = 1; i <= k; i++) {
    int p = clist[i][0];
    for (int u : clist[i]) {
      p = lca(p, u);
    }
    if (c[p] == 0) c[p] = i;
    if (c[p] != i) {
      printf("0\n");
      return 0;
    }
    for (int u : clist[i]) {
      if (u == p) continue;
      c[u] = 0;
      if (!unite(u, p)) {
        printf("0\n");
        return 0;
      }
    }
    clist[i][0] = p;
  }
  dfs2(1);
  printf("%lld\n", dp[1][1]);
  return 0;
}
