#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
//ifstream fin("date.in");
#define MAX 100010
typedef vector<int> :: iterator iter;
vector <int> G[MAX];

int dad[2 * MAX][19];
int fr[2 * MAX][26];
int viz[MAX];
char c[MAX];
int n, d[2 * MAX];
int aux[26];
void lipeste(int nod, int fiu, char val)
{
   // cout << nod << " " << fiu << " " << val << "\n";
    d[fiu] = d[nod] + 1;
    int i;
    dad[fiu][0] = nod;
    for(i = 0 ; i < 26 ; i++)
        fr[fiu][i] = fr[nod][i];
    fr[fiu][val - 'a']++;
    for(i = 1 ; dad[dad[fiu][i - 1]][i - 1] ; i++)
        dad[fiu][i] = dad[dad[fiu][i - 1]][i - 1];
}

void df(int nod)
{
    viz[nod] = 1;
    for(iter it = G[nod].begin() ; it != G[nod].end() ; it++)
    {
        if(!viz[*it])
        {
            lipeste(nod, *it, c[*it]);
            df(*it);
        }
    }
}
void af()
{
    for(int i = 1 ; i <= n ; i++)
    {
        cout << i << "\n";
        for(int j = 0 ; dad[i][j] ; j++)
        {
            cout << dad[i][j] << " ";
        }
        cout << "\n\n";
    }
}

int lca(int a, int b)
{
    if(d[a] < d[b])
    {
        swap(a, b);
    }
    int x = d[a] - d[b];
    for(int i = 0 ; x ; i++)
    {
        if(x & (1 << i))
        {
            x -= (1 << i);
            a = dad[a][i];
        }
    }
    if(a == b)
        return a;
    for(int i = 18 ; i >= 0 ; i--)
    {
        if(dad[a][i] != dad[b][i])
        {
            a = dad[a][i];
            b = dad[b][i];
        }
    }
    return dad[a][0];
}


int main()
{
    int m, i, j, x, y;
    cin >> n >> m;
    for(i = 1; i <= n ; i++)
        cin >> c[i];
    for(i = 1 ; i < n ; i++)
    {
        cin >> x >> y;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    dad[1][0] = 0;
    fr[1][c[1] - 'a']++;
    d[1] = 1;
    df(1);

    while(m--)
    {
        cin >> x;
        if(x == 2)
        {
            cin >> y >> c[0];
            lipeste(y, ++n, c[0]);
        }
        else
        {
            int s = 0;
            cin >> x >> y;
            int l = lca(x, y);
            for(i = 0 ; i < 26 ; i++)
            {
                aux[i] = fr[x][i] + fr[y][i] - fr[l][i] - fr[dad[l][0]][i];
                if(aux[i] % 2 == 1)
                    s++;
            }
            cout << s << "\n";
        }
    }

   // af();
  //  cout << "\n\n\n\n\n";
  //  cout << lca(1, 1);
}