#include <vector>
#include <set>
#include <algorithm>
#include <cctype>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <cstring>
#include <string>
#include <cstdio>
#include <climits>

#define PII pair < int , int >
#define MP make_pair
#define PB push_back
#define F first
#define S second
#define LL long long
#define NMAX 100009
#define sigma 26

using namespace std;

vector < int > g[NMAX];
int t[NMAX],dp[NMAX][sigma];
int x,y,j,cx,cy,ans,lca,N,M,i,node,type;
bool m[NMAX];
char c,let[NMAX];

void df(int n,int fa)
{
    t[n]=fa;
    for (int i=0;i<=25;++i)
    dp[n][i]+=dp[fa][i];

    for (int i=0;i<g[n].size();++i)
    if (g[n][i]!=fa)
    df(g[n][i],n);
}

int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif

scanf("%d%d\n",&N,&M);

for (i=1;i<=N;++i)
{
    scanf("%c",&c);
    let[i]=c;
    dp[i][c-'a']++;
}

node=N;

for (i=1;i<=N-1;++i)
{
    scanf("%d%d",&x,&y);

    g[x].push_back(y);
    g[y].push_back(x);
}

df(1,0);

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

    if (type==2)
    {
        scanf("%d %c\n",&x,&c);
        t[++node]=x;
        let[node]=c;
        memcpy(dp[node],dp[x],sizeof(dp[x]));
        ++dp[node][c-'a'];

        continue;
    }

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

        cx=x;ans=0;
        while (cx)
        {
            m[cx]=true;
            cx=t[cx];
        }

        cy=y;lca=0;
        while (cy && !lca)
        {
            if (m[cy]) lca=cy;
            cy=t[cy];
        }

        for (j=0;j<=25;++j)
        if ((dp[x][j]+dp[y][j]-2*dp[lca][j]+(let[lca]-'a'==j))&1) ++ans;

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

        while (x)
        {
            m[x]=false;
            x=t[x];
        }
    }
}

return 0;
}