#include<bits/stdc++.h>
using namespace std;
#define fast ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define dbg(a,b,c,d) cerr<<a<<" "<<b<<" "<<c<<" "<<d<<endl;
#define kill(a) {cout<<a<<endl;continue;}
#define KILL(a) {cout<<a<<endl;return 0;}
#define debug cerr<<"Error Found"<<endl;
#define mem(a,b) memset(a,b,sizeof(a))
#define lcm(a, b) (a/__gcd(a,b))*b
#define w(t) cin>>t;while(t--)
#define pi 2 * acos(0.0)
#define endl "\n"
int t, cs = 0;
const int mxn = 2e5 + 3, mod = 1e9 + 7;
pair<int,int>mx_path;
vector<int>adj[mxn];
bool vis[mxn];
int dis[mxn];
int tot_dis, ans;
void find_tot_dis(int n, int par)
{
for(auto i:adj[n])
{
if(i == par)continue;
find_tot_dis(i, n);
if(vis[i])dis[n] += dis[i] + 1, vis[n] = true;
}
}
void dfs(int n, int par, int dis)
{
if(vis[n])mx_path = max(mx_path, make_pair(dis, n));
for(auto i:adj[n])if(i != par)dfs(i, n, dis + 1);
}
void DFS(int n, int par, int dis)
{
if(vis[n])ans = min(ans, tot_dis - dis);
for(auto i:adj[n])
{
if(i == par)continue;
DFS(i, n, dis + 1);
}
}
int32_t main()
{
//fast;
w(t)
{
int n;
cin >> n;
int root = 0;
ans = 2e9;
for(int i = 1, a; i <= n; i++)
{
adj[i].clear();
vis[i] = dis[i] = 0;
cin >> a;
if(a)vis[i] = true, root = i;
}
for(int i = 1; i < n; i++)
{
int a, b;
cin >> a >> b;
adj[a].push_back(b), adj[b].push_back(a);
}
if(!root)kill(0);
find_tot_dis(root, -1);
tot_dis = dis[root] * 2;
mx_path = make_pair(-1, 1);
dfs(root, -1, 0);
DFS(mx_path.second, -1, 0);
cout << ans << endl;
}
}