#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <cstdio>
#define ll long long
#define pb push_back
using namespace std;
const int NMAX = 100003;
typedef struct lnod{
    int vf;
    lnod *next;
}*Nod;
Nod a[100005];

int let[200005][26];
int lev[200005];
bool viz[100005];
char lit[200005];

string s;

int lca[200005][19];

void add(Nod &q, int vf){
    Nod p = new lnod;
    p->vf = vf;
    p->next = q;
    q = p;
}

void dfs(int nod, int fath){

    viz[nod] = 1;
    lev[nod] = lev[fath] + 1;
    for(int i=0;i<26;++i) let[nod][i] = let[fath][i];
    let[nod][s[nod-1] - 'a'] ++;

    if(nod != 1)
    {
        lca[nod][0] = fath;
        for(int j=1;j<19;++j) if(lca[nod][j-1] == -1) lca[nod][j] = -1; else lca[nod][j] = lca[lca[nod][j-1]][j-1];
    }

    for(Nod p=a[nod];p;p=p->next)
        if(!viz[p->vf])
        {
            dfs(p->vf, nod);
        }
}


int main(){
    #ifndef ONLINE_JUDGE
    freopen("C.in","r",stdin);
    freopen("C.out","w",stdout);
    #endif
    int N,M,x,y,j,i,op;
    char ch;

    cin >> N >> M;

    cin >> s;
    for(i=0;i<s.length();++i)
        lit[i+1] = s[i] - 'a';

    for(i=1;i<N;++i){
        cin >> x >> y;
        add(a[x],y);
        add(a[y],x);
    }

    for(i=0;i<19;++i) lca[1][i] = -1;
    lca[1][0] = 0;
    dfs(1,0);

    for(i=1;i<=M;++i)
    {
        cin >> op >> x;

        if(op == 1)
        {
            cin >> y;

            int xi = x, yi = y;

            while(lev[xi] != lev[yi])
            {
                if(lev[xi] > lev[yi])
                {
                    j = 0;
                    while(lev[xi] - (1<<(j+1)) >= lev[yi]) ++j;
                    xi = lca[xi][j];
                }
                else
                {
                    j = 0;
                    while(lev[yi] - (1<<(j+1)) >= lev[xi]) ++j;
                    yi = lca[yi][j];
                }
            }

            int ans = 0;

            while(xi != yi)
            {
                j = 0;
                while(lca[xi][j+1] != lca[yi][j+1]) ++j;
                xi = lca[xi][j];
                yi = lca[yi][j];
            }

            for(j=0;j<26;++j) ans += ((let[x][j] + let[y][j] - let[xi][j] - (lca[xi][0] > 0 ? let[lca[xi][0]][j] : 0)) % 2 == 1);

            cout << ans << '\n';

        }
        else
        {
            cin >> ch;
            ++N;
            lit[N] = ch;
            for(j=0;j<26;++j) let[N][j] = let[x][j];

            let[N][ch - 'a'] ++;

            lev[N] = lev[x] + 1;

            lca[N][0] = x;
            for(j=1;j<19;++j) if(lca[N][j-1] == -1) lca[N][j] = -1; else lca[N][j] = lca[lca[N][j-1]][j-1];
        }

    }


    return 0;
}