#include<bits/stdc++.h>
#define ls t[p].l
#define rs t[p].r
using namespace std;
const int N=1e5+25;
struct Edge{
int to,next;
}edge[N*2];
int pval[N];
int head[N],cnt,n,m,b[N];
int fa[N],dep[N],son[N],siz[N];
int top[N],dfn[N],rnk[N],dfnx;
int segt,root[N],len,f[N][30];
struct SegTree{
int l,r,val;
}t[N>>8];
int modify(int pre,int l,int r,int x)
{
int p=++segt;
t[p].val=t[pre].val+1;
t[p].l=t[pre].l;
t[p].r=t[pre].r;
if (l==r) return p;
int mid=(l+r)>>1;
if (x<=mid) ls=modify(ls,l,mid,x);
else rs=modify(rs,mid+1,r,x);
return p;
}
inline void dfs1(int u,int fat){
dep[u]=dep[fat]+1;
fa[u]=fat;
f[u][0]=fa[u];
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(v==fat)continue;
dfs1(v,u);
}
}
inline void dfs2(int u){
root[u]=modify(root[fa[u]],1,len,pval[u]);
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(v==fa[u])continue;
dfs2(v);
}
}
int Lca(int x,int y){
if (dep[x]<dep[y]) swap(x,y);
for (int i=18;i>=0;--i)
if (dep[f[x][i]]>=dep[y])
x=f[x][i];
if (x==y) return y;
for (int i=18;i>=0;--i)
if (f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];
return fa[x];
}
inline void add(int x,int y){
edge[++cnt].to=y;
edge[cnt].next=head[x];
head[x]=cnt;
}
int query(int u,int v,int lca,int flca,int l,int r,int k){
if (l==r) return b[l];
int mid=(l+r)>>1;
int x=t[t[u].l].val+t[t[v].l].val-t[t[lca].l].val-t[t[flca].l].val;
if (k<=x) return query(t[u].l,t[v].l,t[lca].l,t[flca].l,l,mid,k);
else return query(t[u].r,t[v].r,t[lca].r,t[flca].r,mid+1,r,k-x);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>pval[i],b[i]=pval[i];
sort(b+1,b+1+n);
len=unique(b+1,b+1+n)-b-1;
for(int i=1;i<=n;i++)
pval[i]=lower_bound(b+1,b+1+len,pval[i])-b;
int x,y;
for(int i=1;i<n;i++){
cin>>x>>y;
add(x,y);
add(y,x);
}
dfs1(1,0);
for (int i=1;i<=18;++i)
for (int j=1;j<=n;++j)
f[j][i]=f[f[j][i-1]][i-1];
dfs2(1);
int u,v,k,lastans=0;
for(int i=1;i<=m;i++){
cin>>u>>v>>k;
u^=lastans;
int lca=Lca(u,v);
lastans=query(root[u],root[v],root[lca],root[fa[lca]],1,len,k);
cout<<lastans<<'\n';
}
}