#include <iostream>
#include <fstream>
#include <vector>
#include <string.h>
#include <queue>

using namespace std;

fstream f("odd.in",ios::in);
fstream g("odd.out",ios::out);

const int nmax = 100005;
vector <int> a[nmax];
vector <int> prec[nmax];
int n,m, x[nmax], i, viz[nmax], lit[30], cer, nod, x1, y, ic, sf,k;
char sir[nmax], c;

void citire()
{
    cin>>n>>m;
    cin>>sir;
    for ( i = 0; i < strlen(sir); i++) {
                                            x[i+1] = (int)sir[i] - (int)'a'+1;
                                            //g<<sir[i];
                                            //g<<x[i]<<" ";
    }
    for (i=1; i<n;i++)
    {
        cin>>x1>>y;
        a[x1].push_back(y);
        a[y].push_back(x1);
    }
}

void parcurgere()
{
    for (i = 1; i<=26; i++) lit[i] = 0;
    for (i = 1; i<=n; i++) prec[i].clear();
    for (i=1;i<=n;i++) viz[i]=0;
    queue <int> q;
    queue <int> q1;
    q.push(ic);
    int nc, nr;
    nc = ic;
    viz[ic] = 1;
    //lit[x[ic]]++;
    /*for (i=1;i<=n;i++)
    {
        g<<i<<":";
        for (vector <int>::iterator it=a[i].begin();it!=a[i].end();++it) g<<*it<<" ";
        g<<'\n';
    }*/
    while (nc!=sf)
    {
        nc = q.front(); q.pop();
        for (vector <int>::iterator it = a[nc].begin(); it!=a[nc].end(); ++it) if (!viz[*it])
        {
            viz[*it]=1;
            q.push(*it);
            prec[*it].push_back(nc);
            //g<<*it<<"\n";
            //lit[x[*it]]++;
        }
    }
    q1.push(sf);
    lit[x[sf]]++;
    nc = sf;
    while (nc!=ic)
    {
        nc = q1.front(); q1.pop();
        //g<<nc<<":";
        for (vector <int>::iterator it = prec[nc].begin(); it!=prec[nc].end();++it)
        {
            //g<<*it<<" ";
            q1.push(*it);
            lit[x[*it]]++;
        }
        //g<<"\n";
    }
    nr=0;
    for (i=1;i<=26;i++)
    {
        //g<<lit[i]<<" ";
        if (lit[i]%2==1) nr++;
    }
    //g<<'\n';
    cout<<nr<<'\n';
}

int main()
{
    citire();
    for (k=1; k<=m;k++)
    {
        cin>>cer;
        if (cer == 2)
        {
            n++;
            cin>>nod>>c;
            a[nod].push_back(n);
            a[n].push_back(nod);
            x[n] = (int)c - (int)'a'+1;
        }
        else
        {
            cin>>ic>>sf;
            parcurgere();
        }
    }
    //for (i=1;i<=n;i++) g<<x[i]<<" ";
    return 0;
}