#include <stdio.h>
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <cstring>

#define maxdim 200005

using namespace std;

int n, op;
int S[26][maxdim], niv[maxdim], P[21][maxdim];
char letters[maxdim];
vector<int> G[maxdim];

void dfs(int nod, int t) {
	++S[letters[nod]-'a'][nod];
	niv[nod] = niv[t]+1;

	for (int son : G[nod]) {
		if (son != t) {
			for (int i = 0; i < 26; ++i) {
				S[i][son] = S[i][nod];
			}
			P[0][son] = nod;
			dfs(son, nod);
		}
	}
}

int lca(int x, int y)
{
    if(niv[x] < niv[y])
        swap(x, y);
 
    int log1, log2;
    for(log1 = 1; (1 << log1) < niv[x]; ++log1);
    for(log2 = 1; (1 << log2) < niv[y]; ++log2);
 
    for(int k = log1; k >= 0; --k)
        if(niv[x] - (1 << k) >= niv[y])
            x = P[k][x];
 
    if(x == y) return x;
 
    for(int k = log2; k >= 0; --k)
        if(P[k][x] && P[k][x] != P[k][y])
            x = P[k][x],
            y = P[k][y];
         
    return P[0][x];
}

int main() {

	#ifndef ONLINE_JUDGE
	freopen("p.in", "r", stdin);
	freopen("p.out", "w", stdout);
	#endif

	scanf("%d %d\n%s", &n, &op, letters+1);
	for (int i = 1; i < n; ++i) {
		int x, y;
		scanf("%d %d", &x, &y);
		G[x].push_back(y);
		G[y].push_back(x);
	}

	dfs(1, 0);
	for (int p = 1; (1<<p) <= n; ++p) {
		for (int i = 1; i <= n; ++i) {
			P[p][i] = P[p-1][P[p-1][i]];
		}
	}

	while (op--) {
		int type;
		scanf("%d", &type);
		if (type == 2) {
			int x; char l;
			scanf("%d %c", &x, &l);
			++n;
			for (int i = 0; i < 26; ++i) {
				S[i][n] = S[i][x];
			}
			P[0][n] = x;
			for (int p = 1; (1<<p) <= n; ++p) {
				P[p][n] = P[p-1][P[p-1][n]];
			}
			niv[n] = niv[x] + 1;
			++S[l-'a'][n];
			letters[n] = l;
		} else {
			int x, y;
			scanf("%d %d", &x, &y);
			int sol = 0;
			int lca_node = lca(x, y);
			// printf("%d\n", lca_node);
			for (int i = 0; i < 26; ++i) {
				if ((S[i][x] + S[i][y] - 2 * S[i][lca_node] + (letters[lca_node]-'a' == i)) & 1) {
					// printf("%d %d %d--------%d\n", S[i][x], S[i][y], S[i][lca_node], i);
					++sol;
				}
			}
			printf("%d\n", sol);
		}
	}

	return 0;
}