#include<bits/stdc++.h>
using namespace std;
using ll=long long int;
void fastio(){ios::sync_with_stdio(false);cin.tie(0);}
vector<ll> take_inputs_0(ll n){vector<ll> v(n);for(int i=0;i<n;i++){cin>>v[i];}return v;}
vector<ll> take_inputs_1(ll n){vector<ll> v(n);for(int i=1;i<n;i++){cin>>v[i];}return v;}
void show(auto x){ cout<<x<<"\n";}
void show1(auto v){ ll n=(signed)v.size();for(int i=0;i<n;i++){cout<<v[i]<<" ";}cout<<"\n";}
void show2(auto v){ ll n=(signed)v.size();for(int i=0;i<n;i++){ cout<<v[i]<<"\n";}}
void sort_it(auto &v){ sort(v.begin(),v.end());}
void reverse_it(auto &v){ reverse(v.begin(),v.end());}
void do_both(auto &v){ sort(v.begin(),v.end());reverse(v.begin(),v.end());}
auto find_max(auto v){ sort(v.begin(),v.end());reverse(v.begin(),v.end());return v[0];}
auto find_min(auto v){ sort(v.begin(),v.end());return v[0];}
vector<ll> bitRep64(ll n){vector<ll> v;int i=0;while(i<=63){if(n&(1LL<<i)){v.push_back(1);}else{v.push_back(0);}i++;}return v;}
vector<ll> bitRep32(ll n){vector<ll> v;int i=0;while(i<=31){if(n&(1LL<<i)){v.push_back(1);}else{v.push_back(0);}i++;}return v;}
vector<string> all_subset(ll n){vector<string> v;for(int i=0;i<(1<<n);i++){string st="";for(int j=0;j<n;j++){if(i&(1<<j)){st+="1";}else{st+="0";}}v.push_back(st);}return v;}
vector<ll> prefix_sum_0(vector<ll> v){ll n=(signed)v.size();for(int i=1;i<n;i++){v[i]=v[i-1]+v[i];}return v;}
vector<ll> prefix_sum_1(vector<ll> v){ll n=(signed)v.size();vector<ll> summ(n+1);for(int i=1;i<=n;i++){summ[i]=summ[i-1]+v[i-1];}return summ;}
///////////////////////////////////
ll ans=0;
ll n;
ll done=0;
ll res=0;
void dfs(ll node,vector<ll> adj[],ll visited[],ll cnt[],ll restricted[])
{
visited[node]=1;
ll countt=0;
for(auto x:adj[node])
{
if(!visited[x])
{
if(cnt[x]>=1){countt++;}
cnt[node]+=cnt[x];
//cnt[node]+=countt+1;
dfs(x,adj,visited,cnt,restricted);
countt+=cnt[x];
}
}
// cout<<node<<" "<<cnt[node]<<"\n";
cnt[node]+=countt;
if(cnt[node]==0)
{
restricted[node]=1;
}
}
void dfs2(ll node,vector<ll> adj[],ll visited[],ll cnt[],ll restricted[])
{
visited[node]=1;
res=ans;
for(auto x:adj[node])
{
if(!visited[x] && restricted[x]==0)
{
if(done<n){ans++;}
done++;
dfs2(x,adj,visited,cnt,restricted);
}
}
if(done<n){ans++;}
//show(ans);
}
int main()
{
int t;cin>>t;
while(t--)
{
cin>>n;
vector<ll> v(n+1);
ll visited[n+1];
ll cnt[n+1];
ll restricted[n+1];
ans=0;
done=0;
res=0;
for(int i=1;i<=n;i++)
{
cin>>v[i];
visited[i]=0;
restricted[i]=0;
cnt[i]=v[i];
}
vector<ll> adj[n+1];
for(int i=0;i<n-1;i++)
{
ll x,y;cin>>x>>y;
adj[x].push_back(y);
adj[y].push_back(x);
}
ll node=-1;
for(int i=1;i<=n;i++)
{
if(v[i]==1)
{
node=i;
break;
}
}
if(node==-1)
{
show(0);
continue;
}
//show(node);
dfs(node,adj,visited,cnt,restricted);
for(int i=1;i<=n;i++)
{
visited[i]=0;
cnt[i]=0;
}
dfs2(node,adj,visited,cnt,restricted);
cout<<res<<"\n";
}
return 0;
}