#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define endl '\n'
using namespace std;
using i64 = long long;
const int si = 1e5 + 10;
int n, m, len, cnt;
int a[si], id[si];
int head[si << 1];
struct Edge {
int ver, Next;
}e[si << 1];
void add(int u, int v) {
e[cnt].ver = v, e[cnt].Next = head[u], head[u] = cnt++;
}
int get_id(int val) {
return lower_bound(id + 1, id + 1 + len, val) - id;
}
int tot = 0;
int ls[si << 5], rs[si << 5];
int root[si << 5], dat[si << 5];
int build(int l, int r) {
int p = ++tot;
if(l == r) return p;
int mid = (l + r) >> 1;
ls[p] = build(l, mid), rs[p] = build(mid + 1, r);
return p;
}
int insert(int last, int l, int r, int v) {
int p = ++tot;
dat[p] = dat[last] + 1;
if(l == r) return p;
int mid = (l + r) >> 1;
if(v <= mid)
ls[p] = insert(ls[last], l, mid, v), rs[p] = rs[last];
else
rs[p] = insert(rs[last], mid + 1, r, v), ls[p] = ls[last];
return p;
}
int ask(int p, int q, int u, int v, int l, int r, int kth) {
if(l == r) return l;
int mid = (l + r) >> 1;
int lcnt = dat[ls[p]] + dat[ls[q]] - dat[ls[u]] - dat[ls[v]];
if(kth <= lcnt)
return ask(ls[p], ls[q], ls[u], ls[v], l, mid, kth);
else
return ask(rs[p], rs[q], rs[u], rs[v], mid + 1, r, kth - lcnt);
}
int dep[si];
int f[si][20];
void dfs(int u, int fa) {
f[u][0] = fa, dep[u] = dep[fa] + 1;
for(int i = 1; i <= 20; ++i)
f[u][i] = f[f[u][i - 1]][i - 1];
for(int i = head[u]; ~i; i = e[i].Next) {
int v = e[i].ver;
if(v == fa) continue;
root[v] = insert(root[u], 1, len, get_id(a[v]));
dfs(v, u);
}
}
int lca(int u, int v) {
if(dep[u] < dep[v]) swap(u, v);
for(int i = 20; i >= 0; --i)
if(dep[f[u][i]] >= dep[v])
u = f[u][i];
if(u == v) return u;
for(int i = 20; i >= 0; --i)
if(f[u][i] != f[v][i])
u = f[u][i], v = f[v][i];
return f[u][0];
}
int main() {
cin.tie(0) -> sync_with_stdio(false);
cin.exceptions(cin.failbit | cin.badbit);
memset(head, -1, sizeof head);
cin >> n >> m;
for(int i = 1; i <= n; ++i)
cin >> a[i], id[i] = a[i];
sort(id + 1, id + 1 + n);
len = unique(id + 1, id + 1 + n) - id - 1;
for(int i = 1; i < n; ++i) {
int u, v; cin >> u >> v;
add(u, v), add(v, u);
}
root[0] = build(1, len);
root[1] = insert(root[0], 1, len, get_id(a[1]));
dfs(1, 0);
int lastans = 0;
while(m --) {
int u, v, k;
cin >> u >> v >> k;
u ^= lastans;
int Lca = lca(u, v), Fa = f[Lca][0];
cout << (lastans = id[ask(root[u], root[v], root[Lca], root[Fa], 1, len, k)]) << endl;
}
return 0;
}