#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstring>
using namespace std;
const int N=100005;
int head[N],net[N*2],edge[N*2],in[N],d[N],fa[N],f[N][18];
int n,m,idx;
bool cow[N],g[N][18][2];
void add(int x,int y)
{
in[y]++;
edge[idx]=y;
net[idx]=head[x];head[x]=idx++;
}
void prework(int u)
{
g[u][0][cow[u]]=1;
f[u][0]=fa[u];
for(int i=1;i<=17;i++)
{
f[u][i]=f[f[u][i-1]][i-1];
g[u][i][0]|=(g[u][i-1][0]|g[f[u][i-1]][i-1][0]);
g[u][i][1]|=(g[u][i-1][1]|g[f[u][i-1]][i-1][1]);
}
for(int i=head[u];i!=-1;i=net[i])
{
int j=edge[i];
if(fa[u]==j) continue;
fa[j]=u;
d[j]=d[u]+1;
prework(j);
}
return ;
}
bool lca(int x,int y,bool z)
{
if(x==y) return cow[x]==z;
bool ans=false;
if(d[x]<d[y]) swap(x,y);
for(int i=17;i>=0;i--)
if(d[f[x][i]]>=d[y])
{
// printf("%d %d %d\n",x,i,z);
// printf("Test:%d\n",g[x][i][z]);
ans|=g[x][i][z];
x=f[x][i];
}
if(x==y) return ans;
for(int i=17;i>=0;i--)
if(f[x][i]!=f[y][i])
{
ans|=g[x][i][z];
ans|=g[y][i][z];
x=f[x][i];y=f[y][i];
}
ans|=g[x][0][z];ans|=g[y][0][z];
return ans;
}
int main()
{
// freopen("P5836_2.in","r",stdin);
// freopen("P5836test.out","w",stdout);
memset(head,-1,sizeof head);
scanf("%d%d",&n,&m);
char c;
getchar();
for(int i=1;i<=n;i++)
{
scanf("%c",&c);
if(c=='H') cow[i]=true;
}
for(int i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
fa[1]=1;prework(1);
for(int i=1;i<=m;i++)
{
int x,y;
bool flag;
char space;
scanf("%d%d%c%c",&x,&y,&space,&c);
if(c=='H') flag=lca(x,y,true);
if(c=='G') flag=lca(x,y,false);
if(flag) printf("1");
else printf("0");
// if(i%8==0)printf("\n");
}
return 0;
}