#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

#define mlog 20
#define sigma 26
#define maxn 200010

int n, m;
int st[mlog][maxn], lvl[maxn];
int sum[maxn][sigma];
vector<int> v[maxn];
char s[maxn];

void update(int tata, int nod)
{
    st[0][nod]=tata;
    lvl[nod]=lvl[tata]+1;

    for(int i=1; st[i-1][st[i-1][nod]]!=0; ++i)
        st[i][nod]=st[i-1][st[i-1][nod]];

    for(int i=0; i<sigma; ++i)
        sum[nod][i]=sum[tata][i];
    sum[nod][s[nod]-'a']++;
}


void df(int tata, int nod)
{
    update(tata, nod);
    for(int i=0; i<v[nod].size(); ++i)
    {
        if(v[nod][i]==tata)
            continue;
        df(nod, v[nod][i]);
    }
}

int lca(int x, int y)
{
    if(lvl[x]>lvl[y])
        swap(x, y);

    for(int i=mlog-1; i>=0; --i)
        if(lvl[st[i][y]]>=lvl[x])
            y=st[i][y];

    if(x==y)
        return x;

    for(int i=mlog-1; i>=0; --i)
        if(st[i][y]!=st[i][x])
        {
            y=st[i][y];
            x=st[i][x];
        }

    x=st[0][x];
    return x;
}


int main()
{
  //  freopen("tree.in", "r", stdin);
    scanf("%d%d\n", &n, &m);
    scanf("%s\n", s+1);
    for(int i=1; i<n; ++i)
    {
        int a, b;
        scanf("%d%d", &a, &b);
        v[a].push_back(b);
        v[b].push_back(a);
    }

    df(0, 1);

    while(m--)
    {
        int tip;
        scanf("%d", &tip);
        if(tip==1)
        {
            int a, b, c, sol=0;
            scanf("%d%d", &a, &b);
            c=lca(a, b);
            for(int i=0; i<sigma; ++i)
                if((sum[a][i]+sum[b][i]-sum[c][i]-sum[st[0][c]][i])%2==1)
                    ++sol;
            printf("%d\n", sol);
        }
        else
        {
            int a;
            char c;
            scanf("%d %c", &a, &c);
            s[++n]=c;
            update(a, n);
        }
    }

    return 0;
}