class node(object): def __init__(self, l, betu): self.route = l self.edges = [] self.letters = [] for i in range(26): self.letters.append(False) self.letter = betu self.letters[self.letter] = True def add(self, x): self.edges.append(x) def Check(l): for element in l: print element.route print element.letters def update(l1, l2): for i in range(len(l1)): if (l1[i] and not l2[i]) or (not l1[i] and l2[i]): l2[i] = True else: l2[i] = False def dfs(x, l): for i in range(len(l[x].edges)): if len(l[l[x].edges[i]].route) == 0 and l[x].edges[i] != 0: l[l[x].edges[i]].route.extend(l[x].route) l[l[x].edges[i]].route.append(x) update(l[x].letters, l[l[x].edges[i]].letters) dfs(l[x].edges[i], l) def count(l): x = 0 for element in l: if element: x+=1 return x def lca(x, y): if len(x.route)>len(y.route): x, y = y, x for i in range(len(x.route)): if x.route[i] != y.route[i]: return x.route[i-1] if i == len(x.route)-1 and x.route[i] == y.route[i]: return x.route[i] return 0 if __name__ == '__main__': lista = [] sol = [] ch = raw_input().split(' ') n, m = int(ch[0]), int(ch[1]) letters = raw_input() for i in range(len(letters)): a = ord(letters[i]) - ord('a') lista.append(node([], a)) for i in range(n-1): ch = raw_input().split(' ') x, y = int(ch[0]), int(ch[1]) lista[x-1].add(y-1) lista[y-1].add(x-1) dfs(0, lista) for i in range(m): ch = raw_input().split(' ') a, b, c1 = int(ch[0]), int(ch[1]), ch[2] if a == 2: c = ord(c1) - ord('a') new = node([], c) new.route.extend(lista[b-1].route) new.route.append(b-1) update(lista[b-1].letters, new.letters) lista.append(new) else: c = int(c1) l = lista[b-1].letters[:] update(lista[c-1].letters, l) a1 = lca(lista[b-1], lista[c-1]) a = lista[a1] if l[a.letter]: l[a.letter] = False else: l[a.letter] = True sol.append(count(l)) for element in sol: print element