#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return x*f;
}
const int maxn = 1e6+10;
struct tree{
int next,to;
}t[maxn<<1];
int js,head[maxn<<1];
int in[maxn],val[maxn];
inline void add(int u,int v){
t[++js].next=head[u];
t[js].to=v;
head[u]=js;
}
int lg[maxn];
int f[maxn][20],death[maxn];
void dfs(int u,int fa){
death[u]=death[fa]+1;
f[u][0]=fa;
val[u]+=val[fa];
for(int i=1;(1<<i)<=death[u];i++){
f[u][i]=f[f[u][i-1]][i-1];
}
for(int i=head[u];i;i=t[i].next){
if(fa!=t[i].to){
dfs(t[i].to, u);
}
}
}
int LCA(int a,int b){
if(death[a]>death[b]) swap(a,b);
while(death[a]>death[b]){
a=f[a][lg[death[a]-death[b]]-1];
}
if(a==b) return a;
for(int i=17;i>=0;--i){
if(f[a][i]==f[b][i]) continue;
else {
a=f[a][i]; b=f[b][i];
}
}
return f[a][0];
}
int rec[maxn];
int main(){
int n,m;
cin>>n>>m;
string ss; cin>>ss;
for(int i=0;i<n;i++){
if(ss[i]=='H') val[i+1]=1;
else val[i+1]=0;
}
for(int i=1;i<n;i++){
int x,y; cin>>x>>y;
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<=m;i++){
int x,y; cin>>x>>y;
string type;
cin>>type;
if(x==y){
if(ss[x-1]==type[0]) cout<<1;
else cout<<0;
continue;
}
int lca=LCA(x, y);
int ans=val[x]+val[y]-(val[lca]<<1)+1;
int standard=death[x]+death[y]-(death[lca]<<1)+1;
if(type[0]=='H'){
ans!=0?cout<<1:cout<<0;
}else{
ans!=standard?cout<<1:cout<<0;
}
}
return 0;
}