#include<bits/stdc++.h>
using namespace std;
#define mod 998244353
#define inf 0x3f3f3f3f
#define re register
#define maxn 300010
#define int long long
#define Orz cout<<"stO %王队% Orz"<<'\n';
int n,m,f1[maxn],f2[maxn];
string a;
struct node
{
int s,t,next;
}edge[maxn];
int head[maxn],cnt;
void add(int s,int t)
{
edge[++cnt].s=s;
edge[cnt].t=t;
edge[cnt].next=head[s];
head[s]=cnt;
}
int f[maxn][25],dep[maxn];
void dfs(int u,int fa)
{
dep[u]=dep[fa]+1;
f[u][0]=fa;
for(re int i=1;i<=23;++i)
f[u][i]=f[f[u][i-1]][i-1];
for(re int i=head[u];i;i=edge[i].next)
{
int tt=edge[i].next;
if(tt==fa) continue;
dfs(tt,u);
}
}
int lca(int p1,int p2)
{
if(dep[p1]<dep[p2]) swap(p1,p2);
for(re int i=23;i>=0;i--)
if(dep[f[p1][i]]>=dep[p2]) p1=f[p1][i];
if(p1==p2) return p1;
for(re int i=23;i>=0;--i)
if(f[p1][i]!=f[p2][i])
p1=f[p1][i],p2=f[p2][i];
return f[p1][0];
}
void kkk(int u,int fa)
{
// cout<<u<<' '<<a[u]<<endl;
if(a[u]=='H') f1[u]++;
else
f2[u]++;
f1[u]+=f1[fa];
f2[u]+=f2[fa];
for(re int i=head[u];i;i=edge[i].next)
{
int tt=edge[i].t;
if(tt==fa) continue;
kkk(tt,u);
}
}
inline int read(){
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9') {if(ch=='-')f=-1; ch=getchar();}
while (ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0'; ch=getchar();}
return x*f;
}
signed main()
{
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
// printf("%dM\n",(sizeof(dp) >> 20));
cin>>n>>m;
cin>>a;
a=' '+a;
for(re int i=1;i<n;++i)
{
int w,b;
w=read(),b=read();
add(w,b),add(b,w);
}
// for(re int i=head[1];i;i=edge[i].next)
// {
// cout<<edge[i].t<<endl;
// }
dfs(1,0);
kkk(1,0);
// for(re int i=1;i<=n;++i)
// cout<<f1[i]<<" "<<f2[i]<<endl;
for(re int i=1;i<=m;++i)
{
int q,b;
char ch;
q=read(),b=read(),cin>>ch;
if(ch=='H')
{
if((f1[q]+f1[b]-f1[lca(q,b)]-f1[f[lca(q,b)][0]])>0)
cout<<1;
else
cout<<0;
}
else
{
if((f2[q]+f2[b]-f2[lca(q,b)]-f2[f[lca(q,b)][0]])>0)
cout<<1;
else
cout<<0;
}
}
return 0;
}