#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 5;
int a[N], f[N], d[N];
bool vis[N];
vector<int> e[N], dia, temp;
void gao(int u, int fa) {
  f[u] = fa, d[u] = d[fa] + 1;
  for (auto v : e[u])
    if (v != fa) gao(v, u);
}
int cal(int u) {
  vis[u] = 1;
  int nc = a[u];
  for (auto v : e[u]) {
    if (vis[v]) continue;
    int c = cal(v);
    if (c == -1) return -1;
    if (nc == 0) {
      nc = c;
    } else {
      if (c != 0 && nc != c) return -1;
    }
  }
  return nc;
}
int col[N];
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
  for (int i = 1, u, v; i < n; ++i)
    scanf("%d%d", &u, &v), e[u].push_back(v), e[v].push_back(u);
  int v1, v2, t1, t2;
  for (int i = 1; i <= n; ++i) {
    if (a[i] == 1)
      v1 = i;
    else if (a[i] == 2)
      v2 = i;
  }
  gao(1, 0);
  t1 = v1, t2 = v2;
  vis[v1] = vis[v2] = 1;
  while (t1 != t2) {
    vis[t1] = vis[t2] = 1;
    if (d[t1] > d[t2])
      t1 = f[t1];
    else if (d[t1] < d[t2])
      t2 = f[t2];
    else
      t1 = f[t1], t2 = f[t2];
  }
  vis[t1] = vis[t2] = 1;
  for (int k = v1; k != t1; k = f[k]) dia.push_back(k);
  for (int k = v2; k != t1; k = f[k]) temp.push_back(k);
  dia.push_back(t1);
  reverse(temp.begin(), temp.end());
  for (auto o : temp) dia.push_back(o);
  int ans = 1;
  for (int i = 0; i < dia.size(); ++i) {
    int t = cal(dia[i]);
    col[i] = t;
    if (t == -1) {
      ans = 0;
      break;
    }
  }
  if (ans == 0) {
    puts("0");
    return 0;
  }
  int l, r;
  for (int i = 0; i < dia.size(); ++i)
    if (col[i] == 2) {
      r = i;
      break;
    }
  for (int i = dia.size() - 1; i >= 0; --i)
    if (col[i] == 1) {
      l = i;
      break;
    }
  ans = r - l;
  if (ans < 0)
    puts("0");
  else
    printf("%d\n", ans);
  return 0;
}
