#include <bits/stdc++.h>
using namespace std;
const int N = 200000 + 5;
int f[N][2], col[N];
int tot;
int head[N], to[N * 2], next1[N * 2];
void lian(int x, int y) {
  to[++tot] = y;
  next1[tot] = head[x];
  head[x] = tot;
}
int ans;
void get(int &d1, int &d2, int x, int c, int fa) {
  d1 = 0, d2 = 0;
  for (int i = head[x]; i; i = next1[i]) {
    int v = to[i];
    if (v == fa) continue;
    int val = min(f[v][c], f[v][c ^ 1] + 1);
    if (val >= d1)
      d2 = d1, d1 = val;
    else if (val > d2)
      d2 = val;
  }
}
void dfs(int x, int fa) {
  f[x][0] = f[x][1] = 1e6;
  for (int i = head[x]; i; i = next1[i]) {
    int v = to[i];
    if (v == fa) continue;
    dfs(v, x);
  }
  int d1, d2;
  if (col[x]) {
    f[x][col[x] - 1] = 0;
    get(d1, d2, x, col[x] - 1, fa);
    ans = max(ans, d1 + d2);
    f[x][col[x] - 1] = d1;
    return;
  }
  f[x][0] = 0;
  get(d1, d2, x, 0, fa);
  int val = d1 + d2;
  f[x][0] = d1;
  f[x][1] = 0;
  get(d1, d2, x, 1, fa);
  val = min(val, d1 + d2);
  f[x][1] = d1;
  ans = max(ans, val);
}
int main() {
  int T;
  cin >> T;
  while (T--) {
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%d", &col[i]);
    tot = 1;
    for (int i = 1; i <= n; i++) head[i] = 0;
    int x, y;
    for (int i = 1; i <= n - 1; i++) {
      scanf("%d %d", &x, &y);
      lian(x, y), lian(y, x);
    }
    ans = 0;
    dfs(1, 0);
    printf("%d\n", (ans + 1) / 2 + 1);
  }
  return 0;
}
