#include <iostream>
#include <stdio.h>
#include <vector>
#include <string.h>
using namespace std;
#define INF 999999999

int n,m;
pair<int,int> queries[100011];
int qL=0;
char Letter[200011];
char inp[100011];

vector<int> Graph[200011];

int Amount[26][200011];

///LCA
int IT[600001];
int LEAFOFFSET;
int L=0;
int inctr=0;
int WhoIs[200011];
int FirstSeen[200011];
int In[200011];

void DFS(int ver,int dad)
{
    int i,j;

    inctr++;

    L++;
    IT[L+LEAFOFFSET]=inctr;
    FirstSeen[ver]=L;
    WhoIs[inctr]=ver;
    In[ver]=inctr;

    for (i=0;i<Graph[ver].size();i++)
    {
        if (Graph[ver][i]==dad)
        continue;

        for (j=0;j<=25;j++)
        {
            Amount[j][ Graph[ver][i] ]=Amount[j][ver];
        }
        Amount[ Letter[ Graph[ver][i] ]-'a' ][ Graph[ver][i] ]++;

        DFS(Graph[ver][i],ver);

        L++;
        IT[L+LEAFOFFSET]=In[ver];
    }

    return;
}

///LCA functions

int MIN(int a,int b)
{
    if (a<b)
    return a;
    else
    return b;
}

int MinRec(int ver,int L,int R,int l,int r)
{
    if (L>r || R<l)
    return INF;
    else if (L>=l && R<=r)
    {
        return IT[ver];
    }
    else
    {
        return MIN( MinRec(2*ver,L,(L+R)/2,l,r) , MinRec(2*ver+1,(L+R)/2+1,R,l,r) );
    }
}

int GetMin(int L,int R)
{
    return MinRec(1,1,LEAFOFFSET+1,L,R);
}

int LCA(int a,int b)
{
    int L,R;
    int d;

    L=FirstSeen[a];
    R=FirstSeen[b];

    if (L>R)
    {
        d=L;
        L=R;
        R=d;
    }

    return WhoIs[ GetMin(L,R) ];
}

int main()
{
    //freopen("test.txt","r",stdin);

    int i,j;
    int cm,x,y;
    char ch;
    int ans=0,amnt=0;
    int LC;
    int a,b;

    scanf("%d %d",&n,&m);

    LEAFOFFSET=1;
    while(LEAFOFFSET<2*n+2)
    LEAFOFFSET*=2;
    LEAFOFFSET--;

    scanf("%s",inp+1);

    for (i=1;i<=n;i++)
    {
        Letter[i]=inp[i];
    }

    for (i=1;i<=n-1;i++)
    {
        scanf("%d %d",&a,&b);

        Graph[a].push_back(b);
        Graph[b].push_back(a);
    }

    for (i=1;i<=m;i++)
    {
        scanf("%d",&cm);

        if (cm==1)
        {
            scanf("%d %d",&x,&y);

            qL++;
            queries[qL].first=x;
            queries[qL].second=y;
        }
        else
        {
            scanf("%d",&x);

            ch='.';
            while(ch<'a' || ch>'z')
            {
                scanf("%c",&ch);
            }

            n++;
            Graph[x].push_back(n);
            Graph[n].push_back(x);

            Letter[n]=ch;
        }
    }

    memset(Amount,0,sizeof(Amount));
    Amount[ Letter[1]-'a' ][1]=1;
    DFS(1,0);

    for (i=LEAFOFFSET;i>=1;i--)
    {
        IT[i]=MIN(IT[2*i],IT[2*i+1]);
    }

    for (i=1;i<=qL;i++)
    {
        x=queries[i].first;
        y=queries[i].second;
        LC=LCA(x,y);

        ans=0;
        for (j=0;j<=25;j++)
        {
            amnt=Amount[j][x]+Amount[j][y]-2*Amount[j][LC];

            if (Letter[LC]-'a'==j)
            amnt++;

            if (amnt%2==1)
            ans++;
        }

        printf("%d\n",ans);
    }

    return 0;
}