#include<bits/stdc++.h>
using namespace std;
const int N=100050;
int n,m;
struct Edge{
int to,nxt;
}e[N*2];
struct F{
int a,w;
}f[N][19];
string s;
int h[N],cnt=1;
void add(int u,int v)
{
e[cnt]={v,h[u]};
h[u]=cnt++;
}
int dh[N],mp[N];
void dd(int st)
{
memset(dh,-1,sizeof dh);
dh[st]=1;
queue<int>q;
q.push(st);
dh[0]=0;
while(q.size())
{
int t=q.front();
q.pop();
for(int i=h[t];i;i=e[i].nxt)
{
int j=e[i].to;
if(dh[j]==-1)
{
dh[j]=dh[t]+1;
q.push(j);
f[j][0].a=t;
f[j][0].w=mp[j]|mp[t];
for(int k=1;k<=log2(dh[j])+1;k++)
{
f[j][k].a=f[f[j][k-1].a][k-1].a;
f[j][k].w=f[j][k-1].w|f[f[j][k-1].a][k-1].w;
}
}
}
}
}
bool lca(int a,int b,string s)
{
int u,v=0;
if(s[0]=='H')
u=1;
else
u=2;
if(dh[a]<dh[b])
swap(a,b);
for(int k=log2(dh[a])+1;k>=0;k--)
if(dh[f[a][k].a]>=dh[b])
{
v|=f[a][k].w;
a=f[a][k].a;
}
if(a==b)
return u&v;
for(int k=log2(dh[a])+1;k>=0;k--)
{
if(f[a][k].a!=f[b][k].a)
{
v|=f[a][k].w;
v|=f[b][k].w;
a=f[a][k].a;
b=f[b][k].a;
}
}
v|=f[a][0].w;
v|=f[b][0].w;
return u&v;
}
int main()
{
cin>>n>>m;
cin>>s;;
int u,v;
for(int i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
for(int i=0;i<n;i++)
if(s[i]=='H')
mp[i+1]=1;
else
mp[i+1]=2;
dd(1);
string a,b="";
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
cin>>a;
if(lca(u,v,a))
b+='1';
else
b+='0';
}
cout<<b;
return 0;
}