#include <bits/stdc++.h>
using namespace std;
inline void proc_status() {
  ifstream t("/proc/self/status");
  cerr << string(istreambuf_iterator<char>(t), istreambuf_iterator<char>())
       << endl;
}
template <typename T>
inline bool chkmin(T &a, const T &b) {
  return a > b ? a = b, 1 : 0;
}
template <typename T>
inline bool chkmax(T &a, const T &b) {
  return a < b ? a = b, 1 : 0;
}
template <typename T>
inline T read() {
  register T sum(0), fg(1);
  register char ch(getchar());
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') fg = -1;
  for (; isdigit(ch); ch = getchar()) sum = sum * 10 - '0' + ch;
  return sum * fg;
}
const int MOD = 998244353;
inline int fpm(int x, int y) {
  int res = 1;
  for (; y; y >>= 1, x = (long long)x * x % MOD)
    if (y & 1) res = (long long)res * x % MOD;
  return res;
}
const int MAXN = (int)3e5;
int n, k;
int a[MAXN + 5];
vector<int> adj[MAXN + 5];
inline void input() {
  n = read<int>(), k = read<int>();
  for (int i = 1; i <= n; ++i) a[i] = read<int>();
  for (int i = 1; i < n; ++i) {
    int u = read<int>(), v = read<int>();
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
}
int col[MAXN + 5], sum[MAXN + 5], cnt[MAXN + 5];
int f[MAXN + 5][2];
inline void dfs(int u, int fa) {
  col[u] = a[u];
  sum[u] = a[u] != 0;
  for (auto v : adj[u])
    if (v != fa) {
      dfs(v, u);
      if (col[v]) {
        if (col[u] && col[v] != col[u]) {
          puts("0");
          exit(0);
        }
        if (col[u] == 0) col[u] = col[v];
        sum[u] += sum[v];
      }
    }
  if (col[u]) {
    f[u][0] = 0;
    f[u][1] = 1;
    for (auto v : adj[u])
      if (v != fa) f[u][1] = (long long)f[u][1] * (f[v][0] + f[v][1]) % MOD;
  } else {
    f[u][0] = 1;
    for (auto v : adj[u])
      if (v != fa) f[u][0] = (long long)f[u][0] * (f[v][0] + f[v][1]) % MOD;
    int prd = 1;
    for (auto v : adj[u])
      if (v != fa) prd = (long long)prd * (f[v][0] + f[v][1]) % MOD;
    for (auto v : adj[u])
      if (v != fa)
        (f[u][1] += (long long)prd * fpm((f[v][0] + f[v][1]) % MOD, MOD - 2) %
                    MOD * f[v][1] % MOD) %= MOD;
  }
  if (cnt[col[u]] == sum[u]) col[u] = sum[u] = 0;
}
inline void solve() {
  for (int i = 1; i <= n; ++i) ++cnt[a[i]];
  dfs(1, 0);
  printf("%d\n", (f[1][1] + MOD) % MOD);
}
int main() {
  input();
  solve();
  return 0;
}
