#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
#include<stack>
#include<stdlib.h>
#include<queue>
#include<climits>
int read(){
int x=0,f=1; char ch=getchar();
while(ch>'9'||ch<'0'){ if(ch=='-'){ f=-1; } ch=getchar(); }
while(ch>='0'&&ch<='9'){ x=(x<<3)+(x<<1)+(ch^48); ch=getchar(); }
return x*f;
}
const int maxn = 1e5+11;
struct tree{
int next;
int to;
}t[maxn<<1];
int head[maxn<<1],js;
void add(int u,int v){
t[++js].next=head[u];
t[js].to=v;
head[u]=js;
}
int w[maxn];
int lg[maxn];
int dep[maxn];
int fa[maxn][22][3];
void dfs(int now,int last){
dep[now]=dep[last]+1;
fa[now][0][0]=last;
fa[now][0][1]=(w[now]==1)|(w[last]==1);
fa[now][0][2]=(w[now]==2)|(w[last]==2);
for(int i=1;i<=lg[dep[now]];i++){
fa[now][i][0]=fa[fa[now][i-1][0]][i-1][0];
fa[now][i][1]=(fa[fa[now][i-1][1]][i-1][1])|(fa[now][i-1][1]);
fa[now][i][2]=(fa[fa[now][i-1][2]][i-1][2])|(fa[now][i-1][2]);
}
for(int i=head[now];i;i=t[i].next){
int to = t[i].to;
if(to != last){
dfs(to,now);
}
}
}
bool lca(int s1,int s2,int s3){
if(dep[s1]<dep[s2]) std:: swap(s1,s2);
while(dep[s1]>dep[s2]){
if(fa[s1][lg[dep[s1]-dep[s2]]-1][s3]!=0){
return true;
}
s1 = fa[s1][lg[dep[s1]-dep[s2]]-1][0];
}
if(s1 == s2){
if(w[s1]==s3){
return true;
}else return false;
}
for(int i=lg[dep[s1]]-1;i>=0;i--){
if(fa[s1][i][0]!=fa[s2][i][0]){
if((fa[s1][i][s3]!=0)||(fa[s2][i][s3])!=0){
return true;
}
s1 = fa[s1][i][0];
s2 = fa[s2][i][0];
}
}
return fa[s1][0][s3]!=0 ? true:false;
}
int main(){
int n=read(),q=read();
std:: string str; std:: cin>>str;
for(int i=1;i<=n;i++){
if(str[i-1]=='H') w[i]=1;
else w[i]=2;
}
for(int i=1;i<n;i++){
int x=read(),y=read();
add(x,y);
add(y,x);
}
for(int i=1;i<=n;i++){
lg[i]=lg[i-1]+((1<<lg[i-1])==i);
}
dfs(1,0);
for(int i=1;i<=q;i++){
int x=read(),y=read(),z;
std:: string ss;
std:: cin>>ss;
if(ss[0]=='H'){
z=1;
}else z=2;
if(lca(x,y,z)) std:: cout<<"1";
else std:: cout<<"0";
}
return 0;
}