#include <fstream>
#include <vector>
using namespace std;
ifstream fin("odd.in");
ofstream fout("odd.out");
int fr[31],n,m,ok,nrIMP,x,y,cer,nrq;
char ch;
struct graf{int used; char ch; vector<int>lst;} nod[200005];
void calc()
{
    nrIMP=0;
    for(int i=0;i<=30;i++)
        if(fr[i]%2!=0)  nrIMP++;
}
void bkt(int poz)
{
    nod[poz].used=nrq; fr[nod[poz].ch-'a']++;
    if(poz==y) {ok=1; calc();}
    else
    {
        for(int i=0;i<nod[poz].lst.size();i++)
            if(nod[nod[poz].lst[i]].used!=nrq)
            {
                bkt(nod[poz].lst[i]);
                if(ok==1) break;
            }
    }
    fr[nod[poz].ch-'a']--;
}
int query()
{
    bkt(x);
    return nrIMP;
}

int main()
{
    fin>>n>>m; fin.get();
    for(int i=1;i<=n;i++)
        fin>>nod[i].ch;
    for(int i=1;i<=n-1;i++)
    {
        fin>>x>>y;
        nod[x].lst.push_back(y);
        nod[y].lst.push_back(x);
    }
    for(int i=1;i<=m;i++)
    {
        fin>>cer;
        if(cer==1)
        {
            ok=0;
            nrq++;
            fin>>x>>y;
            fout<<query()<<'\n';
        }
        else
        {
            fin>>x>>ch;
            nod[++n].ch=ch;
            nod[n].lst.push_back(x);
            nod[x].lst.push_back(n);
        }
    }
    return 0;
}