#include <iostream>
#define DIM 200001
#include <vector>
using namespace std;

int n, m, prez[30], res, x, y, vf, nr_node;

char ch;

vector <int> node[DIM];

short vis[DIM], val[DIM], tip;

int dfs(int vfc)
{
    vis[vfc]=1;
    for(int i=0; i<node[vfc].size(); ++i)
    {
        if(vis[node[vfc][i]]==0)
        {
            prez[val[node[vfc][i]]]++;
            if(node[vfc][i]==y)
            {
                res=0;
                for(int k=0; k<=26; ++k)
                    if(prez[k]%2)
                        res++;
                break;
            }
            dfs(node[vfc][i]);
            prez[val[node[vfc][i]]]--;
        }
    }
    return res;
}

int main()
{
    cin>>n>>m;
    nr_node=n;
    cin.get();
    for(int i=1; i<=n; ++i)
    {
        ch=cin.get();
        val[i]=(int)ch-97;
    }
    for(int i=1; i<=n-1; ++i)
    {
        cin>>x>>y;
        node[x].push_back(y);
        node[y].push_back(x);
    }
    for(int j=1; j<=m; ++j)
    {
        cin>>tip;
        if(tip==2)
        {
            cin>>vf;
            cin.get();
            ch=cin.get();
            nr_node++;
            val[nr_node]=(int)ch-97;
            node[vf].push_back(nr_node);
            node[nr_node].push_back(vf);
        }
        if(tip==1)
        {
            cin>>x>>y;
            prez[val[x]]++;
            cout<<dfs(x)<<"\n";
            for(int k=0; k<=26; ++k)
            {
                prez[k]=0;
            }
            for(int k=1; k<=nr_node; ++k)
                vis[k]=0;
        }
    }
    return 0;
}