#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<iomanip>
#include<ctime>
#include<stack>
using namespace std;
const int maxn=100005;
int n,m,st[maxn][30][3],deep[maxn],cnt,p[maxn];
string s;
int ans[maxn];
struct node{
int v,next;
}e[maxn*2];
void insert(int u,int v){
cnt++;
e[cnt].next=p[u];
e[cnt].v=v;
p[u]=cnt;
}
void dfs(int u,int fa,int dep){
deep[u]=dep;
st[u][0][0]=fa;
st[u][0][1]=(s[u-1]=='G')||(fa>0&&s[fa-1]=='G');
st[u][0][2]=(s[u-1]=='H')||(fa>0&&s[fa-1]=='H');
for(int i=p[u];i!=-1;i=e[i].next){
int v=e[i].v;
if(v==fa) continue;
dfs(v,u,dep+1);
}
}
int main()
{
memset(p,-1,sizeof(p));
cin>>n>>m>>s;
for(int i=1;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
insert(u,v);
insert(v,u);
}
dfs(1,-1,1);
for(int i=1;i<=n;i++){
for(int j=1;(1<<j)<deep[i];j++){
st[i][j][0]=st[st[i][j-1][0]][j-1][0];
st[i][j][1]=st[i][j-1][1]||st[st[i][j-1][0]][j-1][1];
st[i][j][2]=st[i][j-1][2]||st[st[i][j-1][0]][j-1][2];
}
}
for(int i=1;i<=n;i++){
for(int j=0;j<=20;j++){
if(st[i][j][0]<=0) st[i][j][0]=st[i][j][1]=st[i][j][2]=0;
// cout<<i<<" "<<j<<" "<<st[i][j][0]<<" "<<st[i][j][1]<<" "<<st[i][j][2]<<endl;
}
}
for(int i=1;i<=m;i++){
int a,b;
char c;
// scanf("%d%d%c",&a,&b,&c);
cin>>a>>b>>c;
int d=(c=='G'?1:2);
// cout<<deep[a]<<" "<<deep[b]<<endl;
if(a==b){
ans[i]=(s[a-1]==c?1:0);
continue;
}
if(deep[a]<deep[b]) swap(a,b);
for(int j=20;j>=0;j--){
if(deep[a]==deep[b]) break;
if(deep[st[a][j][0]]<deep[b]) continue;
if(st[a][j][d]){
ans[i]=1;
break;
}
a=st[a][j][0];
}
// cout<<deep[a]<<" "<<deep[b]<<endl;
for(int j=20;(!ans[i])&&j>=0;j--){
if(st[a][j][0]==st[b][j][0]) continue;
if(st[a][j][d]||st[b][j][d]){
ans[i]=1;
break;
}
a=st[a][j][0];b=st[b][j][0];
}
if(ans[i]==0&&a!=b&&st[a][0][d]) ans[i]=1;
}
for(int i=1;i<=m;i++) printf("%d",ans[i]);
return 0;
}