#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll read() {
ll 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*10+ch-48;
ch=getchar();
}
return x*f;
}
const ll N=100010;
vector<ll> color[N],e[N];
ll sz[N],vis[N],son[N],top[N],dfn[N],deep[N],f[N],cnt=0,u,v,x,n,m;
struct Node {
ll a,b,c,pos,ans;
} a[N];
struct Tree {
ll l,r,maxn;
} t[4*N];
bool cmp(Node x,Node y) {
return x.c<y.c;
}
bool cmp1(Node x,Node y) {
return x.pos<y.pos;
}
void build(ll q,ll l,ll r) {
t[q].l=l;
t[q].r=r;
if(l==r) {
return ;
}
ll mid=(l+r)/2;
build(q*2,l,mid);
build(q*2+1,mid+1,r);
}
void dfs(ll t,ll fa) {
sz[t]=1;
for (int i=0; i<e[t].size(); i++) {
if(e[t][i]==fa) continue;
deep[e[t][i]]=deep[t]+1;
f[e[t][i]]=t;
dfs(e[t][i],t);
if(sz[son[t]]<sz[e[t][i]]) {
son[t]=e[t][i];
}
sz[t]+=sz[e[t][i]];
}
}
void dfs1(ll t,ll tp) {
top[t]=tp;
dfn[t]=++cnt;
if(son[t]!=0) dfs1(son[t],tp);
for (int i=0; i<e[t].size(); i++) {
if(e[t][i]==f[t]||e[t][i]==son[t]) continue;
dfs1(e[t][i],e[t][i]);
}
}
void change(ll q,ll seat,ll d) {
if(t[q].l==t[q].r) {
t[q].maxn=d;
return ;
}
t[q].maxn=d;
ll mid=(t[q].l+t[q].r)/2;
if(mid>=seat) change(q*2,seat,d);
if(seat>mid) change(q*2+1,seat,d);
}
ll ask_maxn(ll q,ll l,ll r) {
if(t[q].l>=l&&t[q].r<=r) {
return t[q].maxn;
}
ll mid=(t[q].l+t[q].r)/2,ans=0;
if(l<=mid) ans=max(ans,ask_maxn(q*2,l,r));
if(r>mid) ans=max(ans,ask_maxn(q*2+1,l,r));
return ans;
}
ll ask(ll u,ll v,ll co) {
while(top[u]!=top[v]) {
if(deep[top[u]]<deep[top[v]]) swap(u,v);
if(ask_maxn(1,dfn[top[u]],dfn[u])==co) return 1;
u=f[top[u]];
}
if(ask_maxn(1,min(dfn[u],dfn[v]),max(dfn[u],dfn[v]))==co) return 1;
return 0;
}
signed main() {
n=read();
m=read();
for (int i=1; i<=n; i++) {
x=read();
color[x].push_back(i);
}
for (int i=1; i<n; i++) {
u=read();
v=read();
e[u].push_back(v);
e[v].push_back(u);
}
for (int i=1; i<=m; i++) {
a[i].a=read();
a[i].b=read();
a[i].c=read();
a[i].pos=i;
}
dfs(1,0);
dfs1(1,1);
sort(a+1,a+1+m,cmp);
build(1,1,n);
for (int i=1; i<=m; i++) {
if(color[a[i].c].size()==0) continue;
if(!vis[a[i].c]) {
for (int j=0; j<color[a[i].c].size(); j++) {
change(1,dfn[color[a[i].c][j]],a[i].c);
}
vis[a[i].c]=1;
}
a[i].ans=ask(dfn[a[i].a],dfn[a[i].b],a[i].c);
}
sort(a+1,a+1+m,cmp1);
for (int i=1; i<=m; i++) {
printf("%lld",a[i].ans);
}
}