rt.
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define re register
il int maxx(re int x,re int y){
return x>y?x:y;
}
il int minn(re int x,re int y){
return x<y?x:y;
}
il int read(){
int s=0,w=1; char c=getchar();
while(!isdigit(c)){ if(c=='-') w=-1; c=getchar();}
while(isdigit(c)){ s=(s<<3)+(s<<1)+(c^48); c=getchar();}
return s*w;
}
il void write(re int x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9) write(x/10);
putchar((char)(x%10+48));
}
const int N=1e5+5;
int n,m,e,tot;
int to[N<<1],ne[N<<1],h[N],a[N],b[N];
void add(int x,int y){
to[++e]=y,ne[e]=h[x],h[x]=e;
}
int son[N],sz[N],dep[N],fa[N];
void dfs(int x,int Fa){
sz[x]=1,dep[x]=dep[Fa]+1,fa[x]=Fa;
for(int i=h[x];i;i=ne[i]){
int y=to[i];
if(y==Fa) continue;
dfs(y,x);
sz[x]+=sz[y];
if(sz[y]>sz[son[x]]) son[x]=y;
}
}
int top[N];
void dfs2(int x,int t){
top[x]=t;
if(son[x]) dfs2(son[x],t);
for(int i=h[x];i;i=ne[i]){
int y=to[i];
if(y==fa[x] || y==son[x]) continue;
dfs2(y,y);
}
}
int get_lca(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
x=fa[top[x]];
}
if(dep[x]<dep[y]) return x;
return y;
}
int rt[N],cnt;
struct sgt{
int lc,rc,sum;
#define lc(x) tr[x].lc
#define rc(x) tr[x].rc
#define sum(x) tr[x].sum
sgt(){ lc=rc=sum=0;}
}tr[N<<5];
void pushup(int x){
sum(x)=sum(lc(x))+sum(rc(x));
}
void update(int &p,int pre,int l,int r,int x){
if(!p) p=++cnt;
tr[p]=tr[pre];
if(l==r){
++sum(p);
return;
}
int mid=l+r>>1;
if(x<=mid) update(lc(p),lc(pre),l,mid,x);
else update(rc(p),rc(pre),mid+1,r,x);
pushup(p);
}
int query(int x,int y,int lca,int falca,int l,int r,int k){
if(l==r) return l;
int mid=l+r>>1;
int now=sum(lc(x))+sum(lc(y))-sum(lc(lca))-sum(lc(falca));
if(k<=now) return query(lc(x),lc(y),lc(lca),lc(falca),l,mid,k);
else return query(rc(x),rc(x),rc(lca),rc(falca),mid+1,r,k-now);
}
void build(int x){
for(int i=h[x];i;i=ne[i]){
int y=to[i];
if(y==fa[x]) continue;
update(rt[y],rt[x],1,tot,a[y]);
build(y);
}
}
int main(){
// freopen("test.in","r",stdin);
n=read(),m=read();
for(int i=1;i<=n;++i) a[i]=b[i]=read();
sort(b+1,b+n+1);
tot=unique(b+1,b+n+1)-b-1;
for(int i=1;i<=n;++i){
a[i]=lower_bound(b+1,b+tot+1,a[i])-b;
}
for(int i=1;i<n;++i){
int x=read(),y=read();
add(x,y),add(y,x);
}
dfs(1,0);
dfs2(1,1);
update(rt[1],rt[0],1,tot,a[1]);
build(1);
int lst=0;
while(m--){
int x=read(),y=read(),k=read(); x^=lst;
int Mcky=get_lca(x,y);
lst=query(rt[x],rt[y],rt[Mcky],rt[fa[Mcky]],1,tot,k);
lst=b[lst];
write(lst),putchar('\n');
}
return 0;
}