from sys import stdin
g = lambda : stdin.readline().strip()
gl = lambda : g().split()
gil = lambda : [int(var) for var in gl()]
gfl = lambda : [float(var) for var in gl()]
gcl = lambda : list(g())
gbs = lambda : [int(var) for var in g()]
mod = int(1e9)+7
inf = float("inf")
t, = gil()
for _ in range(t):
n, = gil()
adj = [[] for _ in range(n+1)]
isroot = [1]*(n+1)
isroot[0] = 0
for _ in range(n-1):
x, y = gil()
isroot[y] = 0
adj[x].append(y)
clr = [-1]+gbs()
layers = [[isroot.index(1)]]
while 1:
temp = []
for x in layers[-1]:
for y in adj[x]:
temp.append(y)
if temp :
layers.append(temp)
else:
break
l, b = 0, clr.count(1)
for i in range(len(layers)):
if i&1:
l+=len(layers[i])
# print(l, n-l, b, n-b)
if max(n-l, l) == max(n-b, b):
currclr = 0 if l == b else 1
rclr = [0]*(n+1)
for l in layers :
for x in l :
rclr[x] = currclr
currclr ^= 1
# print(rclr)
reqTree, givenTree = [0]*(n+1), [0]*(n+1)
for l in reversed(layers):
for x in l :
for y in adj[x]:
# for given Tree
givenTree[x] += clr[y] + givenTree[y]
# for required Tree
reqTree[x] += rclr[y] + reqTree[y]
# print(reqTree, "req")
# print(givenTree, "given")
ans = 0
for x in range(1, n+1):
for y in adj[x]:
# x -- > y
blr, blg = rclr[y] + reqTree[y], clr[y] + givenTree[y]
ans += abs(blr-blg)
print(ans)
else:
print(-1)
ZnJvbSBzeXMgaW1wb3J0IHN0ZGluCmcgICA9IGxhbWJkYSA6IHN0ZGluLnJlYWRsaW5lKCkuc3RyaXAoKQpnbCAgPSBsYW1iZGEgOiBnKCkuc3BsaXQoKQpnaWwgPSBsYW1iZGEgOiBbaW50KHZhcikgZm9yIHZhciBpbiBnbCgpXQpnZmwgPSBsYW1iZGEgOiBbZmxvYXQodmFyKSBmb3IgdmFyIGluIGdsKCldCmdjbCA9IGxhbWJkYSA6IGxpc3QoZygpKQpnYnMgPSBsYW1iZGEgOiBbaW50KHZhcikgZm9yIHZhciBpbiBnKCldCm1vZCA9IGludCgxZTkpKzcKaW5mID0gZmxvYXQoImluZiIpCiAKdCwgPSBnaWwoKQpmb3IgXyBpbiByYW5nZSh0KToKCW4sID0gZ2lsKCkKCWFkaiA9IFtbXSBmb3IgXyBpbiByYW5nZShuKzEpXQoJaXNyb290ID0gWzFdKihuKzEpCglpc3Jvb3RbMF0gPSAwCglmb3IgXyBpbiByYW5nZShuLTEpOgoJCXgsIHkgPSBnaWwoKQoJCWlzcm9vdFt5XSA9IDAKCQlhZGpbeF0uYXBwZW5kKHkpCgoJY2xyID0gWy0xXStnYnMoKQoKCWxheWVycyAgPSBbW2lzcm9vdC5pbmRleCgxKV1dCgoJd2hpbGUgMToKCQl0ZW1wID0gW10KCQlmb3IgeCBpbiBsYXllcnNbLTFdOgoJCQlmb3IgeSBpbiBhZGpbeF06CgkJCQl0ZW1wLmFwcGVuZCh5KQoJCWlmIHRlbXAgOgoJCQlsYXllcnMuYXBwZW5kKHRlbXApCgkJZWxzZToKCQkJYnJlYWsKCglsLCBiID0gMCwgY2xyLmNvdW50KDEpCgoJZm9yIGkgaW4gcmFuZ2UobGVuKGxheWVycykpOgoJCWlmIGkmMToKCQkJbCs9bGVuKGxheWVyc1tpXSkKCgkjIHByaW50KGwsIG4tbCwgYiwgbi1iKQoKCWlmIG1heChuLWwsIGwpID09IG1heChuLWIsIGIpOgoJCWN1cnJjbHIgPSAwIGlmIGwgPT0gYiBlbHNlIDEKCQlyY2xyID0gWzBdKihuKzEpCgkJZm9yIGwgaW4gbGF5ZXJzIDoKCQkJZm9yIHggaW4gbCA6CgkJCQlyY2xyW3hdID0gY3VycmNscgoJCQljdXJyY2xyIF49IDEKCQkjIHByaW50KHJjbHIpCgoJCXJlcVRyZWUsIGdpdmVuVHJlZSA9IFswXSoobisxKSwgWzBdKihuKzEpCgoJCWZvciBsIGluIHJldmVyc2VkKGxheWVycyk6CgkJCWZvciB4IGluIGwgOgoJCQkJZm9yIHkgaW4gYWRqW3hdOgoKCQkJCQkjIGZvciBnaXZlbiBUcmVlCgkJCQkJZ2l2ZW5UcmVlW3hdICs9IGNsclt5XSArIGdpdmVuVHJlZVt5XQoKCQkJCQkjIGZvciByZXF1aXJlZCBUcmVlIAoJCQkJCXJlcVRyZWVbeF0gKz0gcmNsclt5XSArIHJlcVRyZWVbeV0KCgkJIyBwcmludChyZXFUcmVlLCAicmVxIikKCQkjIHByaW50KGdpdmVuVHJlZSwgImdpdmVuIikKCgkJYW5zID0gMAoKCQlmb3IgeCBpbiByYW5nZSgxLCBuKzEpOgoJCQlmb3IgeSBpbiBhZGpbeF06CgkJCQkjIHggLS0gPiB5CgkJCQlibHIsIGJsZyA9IHJjbHJbeV0gKyByZXFUcmVlW3ldLCBjbHJbeV0gKyBnaXZlblRyZWVbeV0KCQkJCWFucyArPSBhYnMoYmxyLWJsZykKCgkJcHJpbnQoYW5zKQoKCgoKCWVsc2U6CgkJcHJpbnQoLTEpCgoK