#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;
struct SegTree{
int l,r,val;
}t[N>>7];
inline void build(int &p,int l,int r){
++segt;
if(l==r)return;
int mid=(l+r)>>1;
build(ls,l,mid),build(rs,mid+1,r);
}
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){
son[u]=-1,siz[u]=1;
dep[u]=dep[fat]+1;
fa[u]=fat;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(v==fat)continue;
dfs1(v,u);
siz[u]+=siz[v];
if(son[u]==-1||siz[son[u]]<siz[v])son[u]=v;
}
}
inline void dfs2(int u,int topf){
top[u]=topf;
root[u]=modify(root[fa[u]],1,len,pval[u]);
if(son[u]==-1)return;
dfs2(son[u],topf);
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(v==fa[u]||v==son[u])continue;
dfs2(v,v);
}
}
inline int Lca(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]>dep[top[y]])
x=fa[top[x]];
else y=fa[top[y]];
}
return dep[x]<dep[y]?x:y;
}
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[pval[l]];
int mid=(l+r)>>1,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>>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);
dfs2(1,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';
}
}