#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

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 nr[200005][28], N, M, x, nod1, nod2, RMQ[24][600002], F[600002], lg[600002], E[600002], L[600002], y, dad[200005], tip, cnt=0;
vector < int > G[200002];
char s[200005], c;
bitset < 200005 > viz;
struct asd{ int x, y; }op[100005];

void dfs(int nod, int level)
{
    L[nod]=level; E[++E[0]]=nod; F[nod]=E[0];
    ++nr[nod][s[nod]-'a']; viz[nod]=1;
    vector <int>::iterator it=G[nod].begin();
    for (; it!=G[nod].end(); ++it)
        if (!viz[*it])
        {
            FOR(i,0,26)
                nr[*it][i]+=nr[nod][i];
            dad[*it]=nod; dfs(*it, level+1);
            E[++E[0]]=nod; L[E[0]]=level;
        }
}

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;
}

int main()
{
    f.sync_with_stdio(false);
    f>>N>>M>>(s+1);
    for (int i=1; i<N; ++i)
        f>>x>>y, G[x].pb(y), G[y].pb(x);
    while (M--)
    {
        f>>tip;
        if (tip==1) ++cnt, f>>op[cnt].x>>op[cnt].y;
            else
            {
                ++N; f>>x>>c; s[N]=c;
                G[x].pb(N); G[N].pb(x);
            }
    }

    dfs(1, 0); 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,26)
            if ( (nr[op[i].x][j]+nr[op[i].y][j]-nr[lca][j]-nr[dad[lca]][j])&1 )
                ++sol;

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