#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define sum(x) tr[x].sum
#define ls(x) (tr[x].lc)
#define rs(x) (tr[x].rc)
#define lazy(x) (tr[x].lazy)
const int N = 1e5+5;
struct node{
int lc, rc;
int sum;
}tr[N * 100];
int cnt;
int n, q, len;
int root[N];
int dfn[N], cnt1;
int a[N];
int b[N];
int anc[N][20], d[N];
vector<int> mp[N];
int last;
void init(){
for (int j = 1;j <= 18;j++){
for (int i = 1;i <= n;i++) anc[i][j] = anc[anc[i][j - 1]][j - 1];
}
}
int LCA(int u, int v){
if (d[u] < d[v]) swap(u, v);
for (int i = 18;i >= 0;i--){
if (d[anc[u][i]] >= d[v]) u = anc[u][i];
}
if (u == v) return u;
for (int i = 18;i >= 0;i--){
if (anc[u][i] != anc[v][i]) u = anc[u][i], v = anc[v][i];
}
return anc[u][0];
}
void build(int &k, int l, int r){
k = ++cnt;
if (l == r){
sum(k) = 0;
return;
}
int mid = (l + r) >> 1;
build(ls(k), l, mid);
build(rs(k), mid + 1, r);
}
void modify(int &k, int pre, int l, int r, int pos){
k = ++cnt;
sum(k) = sum(pre);
ls(k) = ls(pre);
rs(k) = rs(pre);
if (l == r){
sum(k)++;
return;
}
int mid = (l + r) >> 1;
if (pos <= mid) modify(ls(k), ls(pre), l, mid, pos);
else modify(rs(k), rs(pre), mid + 1, r, pos);
sum(k) = sum(ls(k)) + sum(rs(k));
}
void dfs(int u, int fa){
dfn[u] = ++cnt1;
modify(root[cnt1], root[dfn[fa]], 1, len, lower_bound(b + 1, b + 1 + len, a[cnt1]) - b);
for (int i = 0;i < mp[u].size();i++){
int v = mp[u][i];
if (v == fa) continue;
anc[v][0] = u;
d[v] = d[u] + 1;
dfs(v, u);
}
}
int query(int u, int v, int lca, int lcaf, int l, int r, int k){
if (l >= r) return l;
int x = sum(ls(u)) + sum(ls(v)) - sum(ls(lca)) - sum(ls(lcaf));
int mid = (l + r) >> 1;
if (x >= k) return query(ls(u), ls(v), ls(lca), ls(lcaf), l, mid, k);
else return query(rs(u), rs(v), rs(lca), rs(lcaf), mid + 1, r, k - x);
}
int main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n >> q;
for (int i = 1;i <= n;i++){
cin >> a[i];
b[i] = a[i];
}
sort(b + 1, b + 1 + n);
len = unique(b + 1, b + 1 + n) - b - 1;
for (int i = 1;i < n;i++){
int u, v;
cin >> u >> v;
mp[u].push_back(v);
mp[v].push_back(u);
}
build(root[0], 1, len);
d[1] = 1;
dfs(1, 0);
init();
while (q--){
int u, v, k;
cin >> u >> v >> k;
u ^= last;
int lca = LCA(u, v);
last = b[query(root[dfn[u]], root[dfn[v]], root[dfn[lca]], root[dfn[anc[lca][0]]], 1, len, k)];
cout << last << '\n';
}
return 0;
}