/*
    Keep It Simple!
*/

#include <fstream>
#include <vector>
#include <list>
#include <stack>
#include <string>
#include <cmath>
#include <queue>
#include <vector>
#include <algorithm>
#include <cstring>

using namespace std;

#ifndef ONLINE_JUDGE
    ifstream cin("data.in");
    ofstream cout("data.out");
#else
    #include<iostream>
#endif // ONLINE_JUDGE

#define ll long long
#define mp make_pair
#define fi first
#define se second
#define pb push_back

typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

const int kMaxN = 100005;

int n,m;
vector<int> G[kMaxN];
string letter,aux;
int lvl[kMaxN];
int dad[kMaxN];
int seen[30];

void DFS(int node, int level,int father)
{
    lvl[node] = level;
    dad[node] = father;
    for(int i = 0; i<G[node].size(); ++i)
        if(G[node][i] != father)
            DFS(G[node][i],level+1,node);
}

void LCA(int x, int y)
{
    memset(seen, 0, sizeof(seen));
    seen[letter[x-1]-'a'] = seen[letter[y-1]-'a'] = 1;
    while(x != y)
    {
        if(lvl[x] > lvl[y])
        {
            x = dad[x];
            ++seen[letter[x-1]-'a'];
        }
        else
        {
            y = dad[y];
            ++seen[letter[y-1]-'a'];
        }
    }
    int ans = 0;
    for(int i=0; i<=('z'-'a'); ++i)
        if(seen[i]%2)
            ++ans;
    cout << ans+1 << '\n';
    return;
}

void Solve()
{
    cin >> n >> m >> letter;
    int x,y;
    for(int i=1; i<n; ++i)
    {
        cin >> x >> y;
        G[x].pb(y);
        G[y].pb(x);
    }
    DFS(1,0,0);
    int type;
    char meh;
    for(int i=1; i<=m; ++i)
    {
        cin >> type;
        if(type == 2)
        {
            cin >> x >> meh;
            letter.pb(meh);
            int deb = letter.size();
            G[x].pb(letter.size());
            G[letter.size()].pb(x);
            lvl[letter.size()] = lvl[x]+1;
            dad[letter.size()] = x;
        }
        else if(type == 1)
        {
            cin >> x >> y;
            LCA(x,y);
        }
    }

}

int main()
{
    Solve();
    return 0;
}