#include <vector>
#include <iostream>
using namespace std;


vector<int> gr[200001];
int Lev[200001], T[30][200001], D[200001][27], n, m;
char car[200001];
bool viz[200001];

void dfs(int k, int level)
{
	viz[k]=1;
	int j, i;
	Lev[k]=level;
	for(j=0; j<='z'-'a'; j++)
	{
		D[k][j]=D[T[0][k]][j];
	}
	D[k][car[k]-'a']++;
	for(i=0; i<gr[k].size(); i++)
	{
		if(!viz[gr[k][i]])
		dfs(gr[k][i], level+1);
	}
}


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

int main()
{
	//ofstream cout("a.out");
	int a, b, c, rez, nod, rad;
	char cr;
	int i, j;
	cin>>n>>m;
	for(i=1; i<=n; i++)
	{
		cin>>car[i];
	}
	for(i=1; i<n; i++)
	{
		cin>>a>>b;
		gr[a].push_back(b);
		gr[b].push_back(a);
		T[0][b]=a;
	}
	dfs(1, 1);
	for(i=1; i<=25; i++)
	{
		for(j=1; j<=n; j++)
		{
			T[i][j]=T[i-1][T[i-1][j]];
			if(T[j][n]==0)
					break;
		}
	}
	for(i=1; i<=m; i++)
	{
		cin>>a>>b;
		if(a==2)
		{
			cin>>cr;
			n++;
			T[0][n]=b;
			Lev[n]=Lev[b]+1;
			for(j=1; j<=25; j++)
			{
				T[j][n]=T[j-1][T[j-1][n]];
				if(T[j][n]==0)
					break;
			}
			for(j=0; j<='z'-'a'; j++)
			{
				D[n][j]=D[b][j];
			}
			D[n][cr-'a']++;
		}
		if(a==1)
		{
			cin>>c;
			rez=0;
			nod=lca(b, c);
			for(j='a'-'a'; j<='z'-'a'; j++)
			{
				if((D[b][j]-D[T[0][nod]][j]-D[nod][j]+D[c][j])%2==1)
					rez++;
			}
			cout<<rez<<"\n";
		}
	}
}