#include <bits/stdc++.h>
using namespace std;
const int N=3000010;
int n,m,b[N],f[N][20],d[N],lg[N],rt[N],rn,idx,rv[N],bm[N],ss;
struct node{
int l,r,val;
}a[N];
vector<int>v[N];
int get(int x){
return lower_bound(b+1,b+1+n,x)-b;
}
int newnode(int x){
a[++idx]=a[x];
return idx;
}
int buildtree(int p,int l,int r){
p=++idx;
if(l==r)return p;
int mid=(l+r)>>1;
a[p].l=buildtree(p,l,mid);
a[p].r=buildtree(p,mid+1,r);
return p;
}
int add(int p,int l,int r,int x){
p=newnode(p);
a[p].val++;
if(l==r)return p;
int mid=(l+r)>>1;
if(x<=mid)a[p].l=add(a[p].l,l,mid,x);
else a[p].r=add(a[p].r,mid+1,r,x);
return p;
}
int kth(int p,int q,int lp,int flp,int l,int r,int x){
if(l==r)return l;
int k=a[a[p].l].val+a[a[q].l].val-a[a[lp].l].val-a[a[flp].l].val,mid=(l+r)>>1;
if(x<=k)return kth(a[p].l,a[q].l,a[lp].l,a[flp].l,l,mid,x);
else return kth(a[p].r,a[q].r,a[lp].r,a[flp].r,mid+1,r,x-k);
}
void dfs(int x,int fa){
d[x]=d[fa]+1;
f[x][0]=fa;
rt[rn+1]=add(rv[fa],1,ss,get(bm[x]));
rv[x]=rt[rn+1];
rn++;
for(int i=1;i<=18;i++){
f[x][i]=f[f[x][i-1]][i-1];
}
for(int i=0;i<v[x].size();i++){
int u=v[x][i];
if(u==fa)continue;
dfs(u,x);
}
}
int lca(int x,int y){
if(d[x]<d[y])swap(x,y);
while(d[x]>d[y])x=f[x][lg[d[x]-d[y]]];
if(x==y)return x;
for(int i=18;i>=0;i--){
if(f[x][i]!=f[y][i]){
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
int main(){
cin>>n>>m;
for(int i=2;i<=n;i++)lg[i]=lg[i>>1]+1;
for(int i=1;i<=n;i++)cin>>b[i],bm[i]=b[i];
for(int i=1;i<n;i++){
int x,y;
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
sort(b+1,b+1+n);
ss=unique(b+1,b+1+n)-b-1;
dfs(1,0);
int lst=0;
while(m--){
int x,y,k;
cin>>x>>y>>k;
x^=lst;
lst=b[kth(rv[x],rv[y],rv[lca(x,y)],rv[f[lca(x,y)][0]],1,ss,k)];
cout<<lst<<"\n";
}
return 0;
}