#include <fstream>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <bitset>
#include <queue>
#include <map>
#include <set>
#include <cmath>
#include <iomanip>
#define pb push_back
#define mp make_pair
#define sortvi(a) sort(a.begin(), a.end())
#define FOR(i, start, final) for (int i=start; i<=final; ++i)
#define ROF(i, start, final) for (int i=start; i>=final; --i)

#define f cin
#define g cout

//void f(int &x){char k;for(k=getchar();k<= 32;k=getchar());for(x=0;'0'<=k;k=getchar())x=x*10+k-'0';}


/*void f(int &x)//parsare cu semn
{
	char k; bool semn=0;
	for (k = getchar(); (k>'9' || k<'0');)
    {
        if (k=='-') semn=1;
        k=getchar();
    }
	for (x = 0; '0' <= k; k = getchar())	x = x * 10 + k - '0';
    if (semn==1) x=-x;
}*/


using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair < int, int> pi;
typedef vector< int > vi;
typedef vector< pair< int, int > > vpi;

int N, M, x, nod1, nod2, RMQ[18][400002], F[200002], lg[200002], E[400002], L[200002], y, dad[200005], tip, cnt=0;
vector < int > G[200002], nr[200005], gr[200005];
char s[200005], c;
bitset < 200005 > viz;
struct asd{ int x, y; }op[100005];

void dfst(int nod)
{
    vector <int>::iterator it=gr[nod].begin();
    for (; it!=gr[nod].end(); ++it)
        if (dad[*it]==0) dad[*it]=nod, dfst(*it);
}

void dfs(int nod, int level)
{
    L[nod]=level; E[++E[0]]=nod; F[nod]=E[0];
    vector <int>::iterator it=G[nod].begin();
    for (; it!=G[nod].end(); ++it)
        dfs(*it, level+1), E[++E[0]]=nod;
}

int LCA(int nod1, int nod2)
{
    int st=F[nod1], dr=F[nod2];
    if (st>dr) swap(st, dr);
    int Log=lg[dr-st+1], x=RMQ[Log][st], y=RMQ[Log][dr-(1<<Log)+1];
    if (L[x]<L[y]) return x;
        else return y;
}

void Dfs(int nod)
{
    viz[nod]=1;
    if (gr[nod].size()==1 && nod!=1)
    {
        nr[nod][s[nod]-'a']=1;
        return;
    }
    vector < int >::iterator it=gr[nod].begin();
    for (; it!=gr[nod].end(); ++it)
        if (!viz[*it])
        {
            Dfs(*it);
            FOR(i,0,25) nr[nod][i]+=nr[*it][i];
        }
}

int main()
{
    f.sync_with_stdio(false);
    f>>N>>M>>(s+1);
    for (int i=1; i<N; ++i)
        f>>x>>y, gr[x].pb(y), gr[y].pb(x);
    while (M--)
    {
        f>>tip;
        if (tip==1) f>>op[++cnt].x>>op[cnt].y;
            else
            {
                f>>x>>c; s[++N]=c;
                gr[x].pb(N); gr[N].pb(x);
            }
    }
    for (int i=1; i<=N; ++i)
    {
        for (int j=1; j<=26; ++j)
            nr[i].push_back(0);
        nr[i][s[i]-'a']=1;
    }

    dad[1]=1; dfst(1); Dfs(1);
    FOR(i,2,N)G[dad[i]].pb(i);

    dfs(1, 1); RMQ[0][1]=E[1];
    for (int i=2; i<=E[0]; ++i)
        lg[i]=lg[i/2]+1, RMQ[0][i]=E[i];
    for (int i=1; (1<<i)<=E[0]; ++i)
        for (int j=1; j<=E[0]-(1<<i)+1; ++j)
        {
            x=RMQ[i-1][j]; y=RMQ[i-1][j+(1<<(i-1))];
            if (L[x]<L[y]) RMQ[i][j]=x;
                else RMQ[i][j]=y;
        }

    FOR(i,1,cnt)
    {
        int sol=0, lca=LCA(op[i].x, op[i].y);
        FOR(j,0,25)
            if ( (nr[j][op[i].x]+nr[j][op[i].y]-nr[j][lca])&1 )
                ++sol;

        g<<sol<<'\n';
    }
    return 0;
}