#include<bits/stdc++.h>
#define str string
#define ll long long
#define db double
#define pii pair<int, int>
#define piii pair<int, pii>
#define piiii pair<pii, pii>
#define se second
#define fi first
#define vi vector<int>
#define vii vector<vector<int>>
#define mpii map<int, int>
#define umpii unordered_map<int, int>
#define si set<int>
#define usa unordered_set<int>
#define mulsi multiset<int>
using namespace std;
const int mod=1e9+7;
const int maxn=1e5+1;
int n, m, cnt;
int c1[maxn], in[maxn], out[maxn], tree[maxn << 3];
int par[20][maxn], h[maxn];
int ans[maxn];
vi c2[maxn], a[maxn];
vector<piii> query[maxn];
void dfs1(int u, int p){
in[u] = ++cnt;
for(int v : a[u])
if(v != p)
dfs1(v, u);
out[u] = ++cnt;
c2[c1[u]].push_back(in[u]);
c2[c1[u]].push_back(out[u]);
}
void update(int id, int l, int r, int pos, int val){
if(r < pos || pos < l)
return;
if(l == r){
tree[id] = val;
return;
}
int m = (l + r) >> 1;
update(id * 2, l, m, pos, val);
update(id * 2 + 1, m + 1, r, pos, val);
tree[id] = tree[id * 2] + tree[id * 2 + 1];
}
int get(int id, int l, int r, int u, int v){
if(r < u || v < l)
return 0;
if(u <= l && r <= v)
return tree[id];
int m = (l + r) >> 1;
return get(id * 2, l, m, u, v) + get(id * 2 + 1, m + 1, r, u, v);
}
void dfs2(int u){
for(int v : a[u])
if(par[0][u] != v){
par[0][v] = u; h[v] = h[u] + 1;
for(int i = 1; i < 20; ++i)
par[i][v] = par[i - 1][par[i - 1][v]];
dfs2(v);
}
}
void get(int &u, int k){
for(int i = 0; i < 20; ++i)
if((k >> i) & 1)
u = par[i][u];
}
int lca(int u, int v){
if(h[u] > h[v])
swap(u, v);
get(v, h[v] - h[u]);
if(u == v) return u;
for(int i = 19; ~i; --i)
if(par[i][u] != par[i][v]){
u = par[i][u];
v = par[i][v];
}
return par[0][v];
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> m;
for(int i = 1; i <= n; ++i)
cin >> c1[i];
for(int i = 1; i < n; ++i){
int u, v; cin >> u >> v;
a[u].push_back(v);
a[v].push_back(u);
}
dfs1(1, -1); dfs2(1);
for(int i = 0; i < m; ++i){
int u, v, w; cin >> u >> v >> w;
query[w].push_back({i, {u, v}});
}
for(int i = 1; i <= n; ++i)
if(query[i].size()){
for(int x: c2[i])
update(1, 1, cnt, x, 1);
for(piii q: query[i]){
int pos = q.fi, u = q.se.fi, v = q.se.se;
if(c1[u] == i || c1[v] == i){
ans[pos] = 1;
continue;
}
int uv = lca(u, v);
int cnt1 = get(1, 1, cnt, in[uv], out[uv]);
cnt1 -= get(1, 1, cnt, in[v], out[v]);
cnt1 -= get(1, 1, cnt, in[u], out[u]);
ans[pos] = (cnt1 > 0);
}
for(int x: c2[i])
update(1, 1, cnt, x, 0);
}
for(int i = 0; i < m; ++i) cout << ans[i];
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBzdHIgc3RyaW5nCiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgZGIgZG91YmxlCiNkZWZpbmUgcGlpIHBhaXI8aW50LCBpbnQ+CiNkZWZpbmUgcGlpaSBwYWlyPGludCwgcGlpPgojZGVmaW5lIHBpaWlpIHBhaXI8cGlpLCBwaWk+CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSB2aSB2ZWN0b3I8aW50PgojZGVmaW5lIHZpaSB2ZWN0b3I8dmVjdG9yPGludD4+CiNkZWZpbmUgbXBpaSBtYXA8aW50LCBpbnQ+CiNkZWZpbmUgdW1waWkgdW5vcmRlcmVkX21hcDxpbnQsIGludD4KI2RlZmluZSBzaSBzZXQ8aW50PgojZGVmaW5lIHVzYSB1bm9yZGVyZWRfc2V0PGludD4KI2RlZmluZSBtdWxzaSBtdWx0aXNldDxpbnQ+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgbW9kPTFlOSs3Owpjb25zdCBpbnQgbWF4bj0xZTUrMTsKCmludCBuLCBtLCBjbnQ7CmludCBjMVttYXhuXSwgaW5bbWF4bl0sIG91dFttYXhuXSwgdHJlZVttYXhuIDw8IDNdOwppbnQgcGFyWzIwXVttYXhuXSwgaFttYXhuXTsKaW50IGFuc1ttYXhuXTsKdmkgYzJbbWF4bl0sIGFbbWF4bl07CnZlY3RvcjxwaWlpPiBxdWVyeVttYXhuXTsKCnZvaWQgZGZzMShpbnQgdSwgaW50IHApewoJaW5bdV0gPSArK2NudDsKCWZvcihpbnQgdiA6IGFbdV0pCgkJaWYodiAhPSBwKQoJCQlkZnMxKHYsIHUpOwoJb3V0W3VdID0gKytjbnQ7CgljMltjMVt1XV0ucHVzaF9iYWNrKGluW3VdKTsKCWMyW2MxW3VdXS5wdXNoX2JhY2sob3V0W3VdKTsKfQoKdm9pZCB1cGRhdGUoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCBwb3MsIGludCB2YWwpewoJaWYociA8IHBvcyB8fCBwb3MgPCBsKQoJCXJldHVybjsKCWlmKGwgPT0gcil7CgkJdHJlZVtpZF0gPSB2YWw7CgkJcmV0dXJuOwoJfQoJaW50IG0gPSAobCArIHIpID4+IDE7Cgl1cGRhdGUoaWQgKiAyLCBsLCBtLCBwb3MsIHZhbCk7Cgl1cGRhdGUoaWQgKiAyICsgMSwgbSArIDEsIHIsIHBvcywgdmFsKTsKCXRyZWVbaWRdID0gdHJlZVtpZCAqIDJdICsgdHJlZVtpZCAqIDIgKyAxXTsKfQoKaW50IGdldChpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2KXsKCWlmKHIgPCB1IHx8IHYgPCBsKQoJCXJldHVybiAwOwoJaWYodSA8PSBsICYmIHIgPD0gdikKCQlyZXR1cm4gdHJlZVtpZF07CglpbnQgbSA9IChsICsgcikgPj4gMTsKCXJldHVybiBnZXQoaWQgKiAyLCBsLCBtLCB1LCB2KSArIGdldChpZCAqIDIgKyAxLCBtICsgMSwgciwgdSwgdik7Cn0KCnZvaWQgZGZzMihpbnQgdSl7Cglmb3IoaW50IHYgOiBhW3VdKQoJCWlmKHBhclswXVt1XSAhPSB2KXsKCQkJcGFyWzBdW3ZdID0gdTsgaFt2XSA9IGhbdV0gKyAxOwoJCQlmb3IoaW50IGkgPSAxOyBpIDwgMjA7ICsraSkKCQkJCXBhcltpXVt2XSA9IHBhcltpIC0gMV1bcGFyW2kgLSAxXVt2XV07CgkJCWRmczIodik7CgkJfQp9Cgp2b2lkIGdldChpbnQgJnUsIGludCBrKXsKCWZvcihpbnQgaSA9IDA7IGkgPCAyMDsgKytpKQoJCWlmKChrID4+IGkpICYgMSkKCQkJdSA9IHBhcltpXVt1XTsKfQoKaW50IGxjYShpbnQgdSwgaW50IHYpewoJaWYoaFt1XSA+IGhbdl0pCgkJc3dhcCh1LCB2KTsKCWdldCh2LCBoW3ZdIC0gaFt1XSk7CglpZih1ID09IHYpIHJldHVybiB1OwoJZm9yKGludCBpID0gMTk7IH5pOyAtLWkpCgkJaWYocGFyW2ldW3VdICE9IHBhcltpXVt2XSl7CgkJCXUgPSBwYXJbaV1bdV07CgkJCXYgPSBwYXJbaV1bdl07CgkJfQoJcmV0dXJuIHBhclswXVt2XTsKfQoKaW50IG1haW4oKXsKCWlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7CgljaW4udGllKDApOyBjb3V0LnRpZSgwKTsKCWNpbiA+PiBuID4+IG07Cglmb3IoaW50IGkgPSAxOyBpIDw9IG47ICsraSkKCQljaW4gPj4gYzFbaV07Cglmb3IoaW50IGkgPSAxOyBpIDwgbjsgKytpKXsKCQlpbnQgdSwgdjsgY2luID4+IHUgPj4gdjsKCQlhW3VdLnB1c2hfYmFjayh2KTsKCQlhW3ZdLnB1c2hfYmFjayh1KTsKCX0KCWRmczEoMSwgLTEpOyBkZnMyKDEpOwoJZm9yKGludCBpID0gMDsgaSA8IG07ICsraSl7CgkJaW50IHUsIHYsIHc7IGNpbiA+PiB1ID4+IHYgPj4gdzsKCQlxdWVyeVt3XS5wdXNoX2JhY2soe2ksIHt1LCB2fX0pOwoJfQoJZm9yKGludCBpID0gMTsgaSA8PSBuOyArK2kpCgkJaWYocXVlcnlbaV0uc2l6ZSgpKXsKCQkJZm9yKGludCB4OiBjMltpXSkKCQkJCXVwZGF0ZSgxLCAxLCBjbnQsIHgsIDEpOwoJCQlmb3IocGlpaSBxOiBxdWVyeVtpXSl7CgkJCQlpbnQgcG9zID0gcS5maSwgdSA9IHEuc2UuZmksIHYgPSBxLnNlLnNlOwoJCQkJaWYoYzFbdV0gPT0gaSB8fCBjMVt2XSA9PSBpKXsKCQkJCQlhbnNbcG9zXSA9IDE7CgkJCQkJY29udGludWU7CgkJCQl9CgkJCQlpbnQgdXYgPSBsY2EodSwgdik7CgkJCQlpbnQgY250MSA9IGdldCgxLCAxLCBjbnQsIGluW3V2XSwgb3V0W3V2XSk7CgkJCQljbnQxIC09IGdldCgxLCAxLCBjbnQsIGluW3ZdLCBvdXRbdl0pOwoJCQkJY250MSAtPSBnZXQoMSwgMSwgY250LCBpblt1XSwgb3V0W3VdKTsKCQkJCWFuc1twb3NdID0gKGNudDEgPiAwKTsKCQkJfQoJCQlmb3IoaW50IHg6IGMyW2ldKQoJCQkJdXBkYXRlKDEsIDEsIGNudCwgeCwgMCk7CgkJfQoJZm9yKGludCBpID0gMDsgaSA8IG07ICsraSkgY291dCA8PCBhbnNbaV07CglyZXR1cm4gMDsKfQo=