#include using namespace std; typedef long long ll; const int MX = (1<<20); int sz[MX] , cnt[MX][2][2]; int n , A[MX] , depth[MX]; vector < int > v[MX]; ll ans; void Pdfs(int x , int p){ for(auto nxt : v[x]){ if(nxt == p) continue; depth[nxt] = (depth[x] ^ 1); Pdfs(nxt , x); } } void dfs(int x , int p){ cnt[x][0][0] = cnt[x][0][1] = cnt[x][1][0] = cnt[x][1][1] = 0; for(auto nxt : v[x]){ if(nxt == p) continue; dfs(nxt , x); for(int j = 0 ; j < 2 ; j++) for(int i = 0 ; i < 2 ; i++){ ans += 1ll * cnt[nxt][j][i] * 1ll * cnt[x][1^j][i]; ans += 1ll * cnt[nxt][j][i] * 1ll * cnt[x][j][1^i]; } for(int j = 0 ; j < 2 ; j++) for(int i = 0 ; i < 2 ; i++) cnt[x][j][i] += cnt[nxt][j][i]; } ans += cnt[x][A[x]][1^depth[x]]; ans += cnt[x][1^A[x]][depth[x]]; cnt[x][A[x]][depth[x]]++; } int main(){ #ifdef YALALOV freopen("in.in","r",stdin); #endif // YALALOV int T; cin>>T; while(T--){ scanf("%d",&n); for(int j = 1 ; j <= n ; j++) v[j].clear(); for(int j = 1 ; j < n ; j++){ int a , b; scanf("%d %d",&a,&b); v[a].push_back(b); v[b].push_back(a); } for(int j = 1 ; j <= n ; j++){ int x; scanf("%d",&x); A[j] = 0; while(x > 0){ A[j] ^= (x&1); x >>= 1; } } Pdfs(1 , -1); ans = 0; dfs(1 , -1); cout<