from sys import setrecursionlimit
setrecursionlimit(10**6)
class Graph:
def __init__(self,V):
self.V=V
self.graph=[[] for i in range(V+1)]
self.longest=1
def addEdges(self):
for _ in range(len(self.graph)-2):
u,v=map(int, input().split())
self.graph[u].append(v)
self.graph[v].append(u)
self.val=[0]
for i in input():
self.val.append(i)
def DFS_BFS_mixed(self,qu,qu1,depth,alset):
self.longest = max(depth,self.longest)
set1=dict()
for each in qu1:
if self.val[each] in set1:
set1[self.val[each]].append(each)
else:
set1[self.val[each]]=[each]
for each in qu:
if self.val[each] in set1:
for every in set1[self.val[each]]:
if (each not in alset) and (every not in alset):
s1,s2 = set(self.graph[each]),set(self.graph[every])
alset.add(each)
alset.add(every)
self.DFS_BFS_mixed(s1,s2,depth+2,alset)
def start(self):
for i in range(1,self.V+1):
set1=dict()
for j in self.graph[i]:
if self.val[i] == self.val[j]:
s1,s2 = set(self.graph[i]),set(self.graph[j])
path=set([i,j])
self.DFS_BFS_mixed(s1,s2,2,path)
if self.val[j] in set1:
for each in set1[self.val[j]]:
s1,s2 = set(self.graph[each]),set(self.graph[j])
path=set([i,each,j])
self.DFS_BFS_mixed(s1,s2,3,path)
set1[self.val[j]].append(j)
else:
set1[self.val[j]]=[j]
print(self.longest)
t=int(input())
for _ in range(t):
V=int(input())
gra=Graph(V)
gra.addEdges()
gra.start()
ZnJvbSBzeXMgaW1wb3J0IHNldHJlY3Vyc2lvbmxpbWl0CgpzZXRyZWN1cnNpb25saW1pdCgxMCoqNikKCmNsYXNzIEdyYXBoOgogICAgZGVmIF9faW5pdF9fKHNlbGYsVik6CiAgICAgICAgc2VsZi5WPVYKICAgICAgICBzZWxmLmdyYXBoPVtbXSBmb3IgaSBpbiByYW5nZShWKzEpXQogICAgICAgIHNlbGYubG9uZ2VzdD0xCiAgICAgICAgCiAgICBkZWYgYWRkRWRnZXMoc2VsZik6CiAgICAgICAgZm9yIF8gaW4gcmFuZ2UobGVuKHNlbGYuZ3JhcGgpLTIpOgogICAgICAgICAgICB1LHY9bWFwKGludCwgaW5wdXQoKS5zcGxpdCgpKQogICAgICAgICAgICBzZWxmLmdyYXBoW3VdLmFwcGVuZCh2KQogICAgICAgICAgICBzZWxmLmdyYXBoW3ZdLmFwcGVuZCh1KQogICAgICAgIAogICAgICAgIHNlbGYudmFsPVswXQogICAgICAgIGZvciBpIGluIGlucHV0KCk6CiAgICAgICAgICAgIHNlbGYudmFsLmFwcGVuZChpKQoKICAgIGRlZiBERlNfQkZTX21peGVkKHNlbGYscXUscXUxLGRlcHRoLGFsc2V0KToKICAgICAgICBzZWxmLmxvbmdlc3QgPSBtYXgoZGVwdGgsc2VsZi5sb25nZXN0KQogICAgICAgIHNldDE9ZGljdCgpCiAgICAgICAgZm9yIGVhY2ggaW4gcXUxOgogICAgICAgICAgICBpZiBzZWxmLnZhbFtlYWNoXSBpbiBzZXQxOgogICAgICAgICAgICAgICAgc2V0MVtzZWxmLnZhbFtlYWNoXV0uYXBwZW5kKGVhY2gpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZXQxW3NlbGYudmFsW2VhY2hdXT1bZWFjaF0KICAgICAgICAKICAgICAgICBmb3IgZWFjaCBpbiBxdToKICAgICAgICAgICAgaWYgc2VsZi52YWxbZWFjaF0gaW4gc2V0MToKICAgICAgICAgICAgICAgIGZvciBldmVyeSBpbiBzZXQxW3NlbGYudmFsW2VhY2hdXToKICAgICAgICAgICAgICAgICAgICBpZiAoZWFjaCBub3QgaW4gYWxzZXQpIGFuZCAoZXZlcnkgbm90IGluIGFsc2V0KToKICAgICAgICAgICAgICAgICAgICAgICAgczEsczIgPSBzZXQoc2VsZi5ncmFwaFtlYWNoXSksc2V0KHNlbGYuZ3JhcGhbZXZlcnldKQogICAgICAgICAgICAgICAgICAgICAgICBhbHNldC5hZGQoZWFjaCkKICAgICAgICAgICAgICAgICAgICAgICAgYWxzZXQuYWRkKGV2ZXJ5KQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkRGU19CRlNfbWl4ZWQoczEsczIsZGVwdGgrMixhbHNldCkKICAgIAogICAgZGVmIHN0YXJ0KHNlbGYpOgogICAgICAgIGZvciBpIGluIHJhbmdlKDEsc2VsZi5WKzEpOgogICAgICAgICAgICBzZXQxPWRpY3QoKQogICAgICAgICAgICBmb3IgaiBpbiBzZWxmLmdyYXBoW2ldOgogICAgICAgICAgICAgICAgaWYgc2VsZi52YWxbaV0gPT0gc2VsZi52YWxbal06CiAgICAgICAgICAgICAgICAgICAgczEsczIgPSBzZXQoc2VsZi5ncmFwaFtpXSksc2V0KHNlbGYuZ3JhcGhbal0pCiAgICAgICAgICAgICAgICAgICAgcGF0aD1zZXQoW2ksal0pCiAgICAgICAgICAgICAgICAgICAgc2VsZi5ERlNfQkZTX21peGVkKHMxLHMyLDIscGF0aCkKICAgICAgICAgICAgICAgIGlmIHNlbGYudmFsW2pdIGluIHNldDE6CiAgICAgICAgICAgICAgICAgICAgZm9yIGVhY2ggaW4gc2V0MVtzZWxmLnZhbFtqXV06CiAgICAgICAgICAgICAgICAgICAgICAgIHMxLHMyID0gc2V0KHNlbGYuZ3JhcGhbZWFjaF0pLHNldChzZWxmLmdyYXBoW2pdKQogICAgICAgICAgICAgICAgICAgICAgICBwYXRoPXNldChbaSxlYWNoLGpdKQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkRGU19CRlNfbWl4ZWQoczEsczIsMyxwYXRoKQogICAgICAgICAgICAgICAgICAgIHNldDFbc2VsZi52YWxbal1dLmFwcGVuZChqKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZXQxW3NlbGYudmFsW2pdXT1bal0KICAgICAgICBwcmludChzZWxmLmxvbmdlc3QpCiAgICAgICAgCnQ9aW50KGlucHV0KCkpCgpmb3IgXyBpbiByYW5nZSh0KToKICAgIFY9aW50KGlucHV0KCkpCiAgICBncmE9R3JhcGgoVikKICAgIGdyYS5hZGRFZGdlcygpCiAgICBncmEuc3RhcnQoKQo=