#include<iostream>
#include<vector>
#include<bitset>
using namespace std;
#define NMAX 200005
#define pb push_back
//ifstream cin("date.in");
//ofstream cout("date.out");
vector <int> v[NMAX];
bitset <256> ap;
bitset <NMAX> viz;
int n,m,t,x,y;
char a[NMAX],ch;
int dfs(int nod, int dest)
{
    int i,fiu;
    viz[nod]=1;
    for (i=0;i<v[nod].size();++i)
    {
        fiu=v[nod][i];
        if (!viz[fiu])
        {
            ap[a[fiu]]=~ap[a[fiu]];
            if (fiu==dest)
            {
                int cont=0;
                for (int j='a';j<='z';++j)
                    if (ap[j])
                        ++cont;
                return cont;
            }
            int rez=dfs(fiu,dest);
            if (rez!=-1)
                return rez;
            ap[a[fiu]]=~ap[a[fiu]];
        }
    }
    return -1;
}
int main()
{
    int i;
    cin>>n>>m>>(a+1);
    for (i=1;i<n;++i)
    {
        cin>>x>>y;
        v[x].pb(y);
        v[y].pb(x);
    }
    for (i=1;i<=m;++i)
    {
        cin>>t>>x;
        if (t==2)
        {
            cin>>ch;
            a[++n]=ch;
            v[n].pb(x);
            v[x].pb(n);
        }
        else
        {
            cin>>y;
            ap.reset(); viz.reset();
            ap[a[x]]=1;
            cout<<dfs(x,y)<<"\n";
        }
    }
    return 0;
}