#include<bits/stdc++.h>
using namespace std;
bool vis[200010];
int n,m,b[200010],f[200010],dep[200010],t[200010],dis[200010],cnt;
unordered_map<int,vector<int>>c;
vector<int>G[200010];
struct edge{
int l,r,c;
}a[800010];
struct cow{
int x,y,c,id;
}q[100010];
bool cmp(cow a,cow b){
return a.c<b.c;
}
void dfs1(int u,int fa){
f[u]=fa;
dep[u]=dep[fa]+1;
for(int v:G[u]){
if(v==fa){
continue;
}
dfs1(v,u);
}
}
void dfs2(int u,int fa){
t[u]=fa;
dis[u]=++cnt;
int son=-1;
for(int v:G[u]){
if(v==f[u]){
continue;
}
if(son==-1||dep[v]>dep[son]){
son=v;
}
}
if(son!=-1){
dfs2(son,fa);
}
for(int v:G[u]){
if(v==f[u]||v==son){
continue;
}
dfs2(v,v);
}
}
void work(int p,int l,int r){
a[p].l=l;
a[p].r=r;
a[p].c=0;
if(l==r){
return;
}
int mid=(l+r)>>1;
work(p*2,l,mid);
work(p*2+1,mid+1,r);
}
void ud(int p,int pos,int cow){
int l=a[p].l,r=a[p].r;
if(l==r){
a[p].c=cow;
return;
}
int mid=(l+r)>>1;
if(pos<=mid){
ud(p*2,pos,cow);
}else{
ud(p*2+1,pos,cow);
}
a[p].c=max(a[p*2].c,a[p*2+1].c);
}
bool qi(int p,int x,int y,int cow){
if(x<=a[p].l&&a[p].r<=y){
return (a[p].c==cow);
}
int mid=(a[p].l+a[p].r)>>1;
if(x<=mid){
if(qi(p*2,x,y,cow)){
return 1;
}
}
if(y>mid){
if(qi(p*2+1,x,y,cow)){
return 1;
}
}
return 0;
}
bool ask(int u,int v,int cow){
while(t[u]!=t[v]) {
if(dep[t[u]]<dep[t[v]]){
swap(u,v);
}
if(qi(1,dis[t[u]],dis[u],cow)){
return 1;
}
u=f[t[u]];
}
if(dep[u]>dep[v]){
swap(u, v);
}
return qi(1,dis[u],dis[v],cow);
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
vector<int> c[100010];
for(int i=1;i<=n;i++){
cin>>b[i];
c[b[i]].reserve(1000);
c[b[i]].push_back(i);
}
for(int i=1;i<n;i++){
int x,y;
cin>>x>>y;
G[x].push_back(y);
G[y].push_back(x);
}
dfs1(1,0);
dfs2(1,1);
work(1,1,n);
for(int i=1;i<=m;i++){
cin>>q[i].x>>q[i].y>>q[i].c;
q[i].id=i;
}
sort(q+1,q+1+m,cmp);
string ans(m,'0');
for(int i=1;i<=m;i++){
int ct=q[i].c;
if(!c[ct].size()){
continue;
}
if(!vis[ct]){
for(int j=0;j<c[ct].size();j++){
ud(1,dis[c[ct][j]],ct);
}
vis[ct]=1;
}
if(ask(q[i].x,q[i].y,ct)){
ans[q[i].id-1]='1';
}
}
cout<<ans;
return 0;
}