#include<bits/stdc++.h>
using namespace std;
int x[100005];
vector<int> way[100005];
struct edge{
int l,r,val;
}y[2000000];
int top=0,num,n;
int father[100005][20];
int depth[100005];
int root[100005];
pair<int,int>x2[100005];
int z[100005],z2[100005];
int ans[100005];
int LCA(int a,int b){
if(a==b)return a;
for(int i=17;i>=0;i--){
if(father[a][i]!=father[b][i]){
a=father[a][i];
b=father[b][i];
}
}
return father[a][0];
}
int jump(int a,int b){
int got=depth[a]-depth[b];
for(int i=17;i>=0;i--)if(got&(1<<i))a=father[a][i];
return a;
}
void up(int &now,int had,int l,int r,int a){
if(!now)now=++top;//cout<<now<<' '<<had<<' '<<l<<' '<<r<<' '<<a<<endl;
if(l==r&&l==a){
y[now].val=y[had].val+1;
return;
}
int mid=(l+r)/2;
if(a<=mid){
y[now].r=y[had].r;
up(y[now].l,y[had].l,l,mid,a);
}
else{
y[now].l=y[had].l;
up(y[now].r,y[had].r,mid+1,r,a);
}
y[now].val=y[had].val+1;
return;
}
void dfs(int now,int dep){
up(root[now],root[father[now][0]],1,num,z[now]);
for(int i=0;i<way[now].size();i++){
if(way[now][i]!=father[now][0]){
father[way[now][i]][0]=now;
depth[way[now][i]]=dep+1;
dfs(way[now][i],dep+1);
}
}
return;
}
int down(int a,int b,int c,int d,int l,int r,int p){
if(l==r)return l;
int mid=(l+r)/2,left=y[y[a].l].val+y[y[b].l].val-y[y[c].l].val-y[y[d].l].val;
if(p<=left)return down(y[a].l,y[b].l,y[c].l,y[d].l,l,mid,p);
else return down(y[a].r,y[b].r,y[c].r,y[d].r,mid+1,r,p-left);
}
int main(){
int m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&x[i]);
x2[i].first=x[i];
x2[i].second=i;
}
sort(x2+1,x2+n+1);
for(int i=1;i<=n;i++){
if(x2[i].first!=x2[i-1].first)z2[++num]=x2[i].first;
z[x2[i].second]=num;
}
for(int i=1;i<n;i++){
int a,b;
scanf("%d%d",&a,&b);
way[a].push_back(b);
way[b].push_back(a);
}
dfs(1,1);
for(int i=1;i<=17;i++)for(int j=1;j<=n;j++)father[j][i]=father[father[j][i-1]][i-1];
for(int i=1;i<=m;i++){
int a,b,k;
scanf("%d%d%d",&a,&b,&k);
a=a^ans[i-1];
int c,d;
if(depth[a]>depth[b]){
c=LCA(jump(a,b),b);
d=father[c][0];
}
else{
c=LCA(a,jump(b,a));
d=father[c][0];
}
ans[i]=z2[down(root[a],root[b],root[c],root[d],1,num,k)];
}
for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
return 0;
}