#include <bits/stdc++.h>
using namespace std;
const int N = 100000;
const double pi = acos(-1.0);
struct node {
  int to, nxt;
} sq[600600];
int n, k, all = 0, head[300300], col[300300], dep[300300], fa[300300],
          cnt[300300];
long long dp[300300][2];
struct hnode {
  int u, dep;
};
bool operator<(const hnode &p, const hnode &q) { return p.dep < q.dep; }
priority_queue<hnode> q;
int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while ((ch < '0') || (ch > '9')) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while ((ch >= '0') && (ch <= '9')) {
    x = x * 10 + (ch - '0');
    ch = getchar();
  }
  return x * f;
}
long long qpow(long long x, int y) {
  long long ans = 1;
  while (y) {
    if (y & 1) ans = (ans * x) % 998244353;
    x = (x * x) % 998244353;
    y >>= 1;
  }
  return ans;
}
void dfs1(int u, int fu) {
  fa[u] = fu;
  dep[u] = dep[fu] + 1;
  int i;
  for (i = head[u]; i; i = sq[i].nxt) {
    int v = sq[i].to;
    if (v == fu) continue;
    dfs1(v, u);
  }
}
void dfs2(int u, int fu) {
  long long tmp = 1;
  int i;
  dp[u][0] = 1;
  dp[u][1] = 1;
  for (i = head[u]; i; i = sq[i].nxt) {
    int v = sq[i].to;
    if (v == fu) continue;
    dfs2(v, u);
    tmp = (tmp * (dp[v][1] + dp[v][0])) % 998244353;
  }
  if (col[u]) {
    dp[u][0] = tmp;
    dp[u][1] = 0;
  } else {
    dp[u][1] = tmp;
    dp[u][0] = 0;
    for (i = head[u]; i; i = sq[i].nxt) {
      int v = sq[i].to;
      if (v == fu) continue;
      dp[u][0] = (dp[u][0] + ((tmp * qpow(dp[v][0] + dp[v][1], 998244353 - 2)) %
                              998244353 * dp[v][0]) %
                                 998244353) %
                 998244353;
    }
  }
}
void add(int u, int v) {
  all++;
  sq[all].to = v;
  sq[all].nxt = head[u];
  head[u] = all;
}
int main() {
  n = read();
  k = read();
  for (int i = 1; i <= n; i++) col[i] = read();
  for (int i = 1; i <= n - 1; i++) {
    int u = read(), v = read();
    add(u, v);
    add(v, u);
  }
  dfs1(1, 0);
  for (int i = 1; i <= n; i++)
    if (col[i]) {
      q.push((hnode){i, dep[i]});
      cnt[col[i]]++;
    }
  while (!q.empty()) {
    hnode now = q.top();
    q.pop();
    if (col[now.u] == col[fa[now.u]])
      cnt[col[now.u]]--;
    else {
      if (cnt[col[now.u]] > 1) {
        if (!col[fa[now.u]]) {
          col[fa[now.u]] = col[now.u];
          q.push((hnode){fa[now.u], dep[fa[now.u]]});
        } else {
          printf("0");
          return 0;
        }
      }
    }
  }
  dfs2(1, 0);
  printf("%lld", dp[1][0]);
  return 0;
}
