#include <bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const long long maxn = 3e5 + 100;
const long long mod = 998244353;
const long double PI = acos((long double)-1);
long long pw(long long a, long long b, long long md = mod) {
  long long res = 1;
  while (b) {
    if (b & 1) {
      res = (a * res) % md;
    }
    a = (a * a) % md;
    b >>= 1;
  }
  return (res);
}
int n, k;
int h[maxn];
vector<int> adj[maxn];
int a[maxn];
int b[maxn];
int dp[maxn][2];
vector<int> col[maxn];
int par[maxn];
void dfass(int v = 1) {
  dp[v][1] = 1;
  for (auto u : adj[v])
    if (u != par[v])
      dfass(u), dp[v][1] = (dp[v][1] * 1LL * (dp[u][0] + dp[u][1]) % mod) % mod;
  if (b[v]) {
    swap(dp[v][0], dp[v][1]);
    return;
  }
  for (auto u : adj[v])
    if (u != par[v])
      dp[v][0] = (dp[v][0] +
                  (((dp[v][1] * 1LL * pw(dp[u][0] + dp[u][1], mod - 2)) % mod) *
                   dp[u][0]) %
                      mod) %
                 mod;
}
void dfs(int v = 1) {
  for (auto u : adj[v])
    if (u != par[v]) par[u] = v, h[u] = h[v] + 1, dfs(u);
}
int up[maxn];
void color(int v, int c) {
  if (b[v] and b[v] != c) cout << 0, exit(0);
  b[v] = c;
}
void solve(int v, int c) {
  int &u = up[c];
  if (u == 0) {
    u = v, color(v, c);
    return;
  }
  while (h[v] > h[u]) {
    if (b[v] == c) {
      v = u;
      break;
    }
    color(v, c), v = par[v];
  }
  while (u != v) {
    color(v, c), color(u, c);
    u = par[u], v = par[v];
  }
  color(u, c);
}
bool cmp(int a, int b) { return (h[a] < h[b]); }
int32_t main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> k;
  for (int i = 1; i <= n; i++) cin >> a[i], col[a[i]].push_back(i);
  for (int i = 1; i < n; i++) {
    int u, v;
    cin >> u >> v;
    adj[u].push_back(v), adj[v].push_back(u);
  }
  dfs();
  for (int i = 1; i <= k; i++) {
    sort(col[i].begin(), col[i].end(), cmp);
    for (auto v : col[i]) solve(v, i);
  }
  dfass();
  cout << dp[1][0];
  return (0);
}
