#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define LL long long
#define PR pair<int,int>
#define MP make_pair
#define LB long double
using namespace std;
const int kN=2e5+5;
struct Smt{
int s[2],siz;
#define Siz(p) T[p].siz
#define Son(p,k) T[p].s[k]
}T[kN<<7];
int n,m,a[kN],b[kN],cnt;
int to[2*kN],nex[2*kN],head[kN],tot;
int f[kN][30],rt[kN],_2[30],dep[kN];
void Add(int u,int v){
to[++tot]=v;nex[tot]=head[u];head[u]=tot;
}
void Modify(int l,int r,int k,int p1,int &p2){
p2=++cnt;
T[p2]=T[p1];
if(l==r){
Siz(p2)++;return;
}
int mid=(l+r)>>1;
if(k<=mid){Modify(l,mid,k,Son(p1,0),Son(p2,0));}
else{Modify(mid+1,r,k,Son(p1,1),Son(p2,1));}
Siz(p2)=Siz(Son(p2,0))+Siz(Son(p2,1));
}
void Dfs(int x,int fa,int depth){
f[x][0]=fa;dep[x]=depth;
int k=lower_bound(b+1,b+1+n,a[x])-b;
Modify(1,tot,k,rt[fa],rt[x]);
for(int i=head[x];i;i=nex[i]){
int ar=to[i];
if(ar==fa){continue;}
Dfs(ar,x,depth+1);
}
}
int Lca(int x,int y){
if(dep[x]<dep[y]){swap(x,y);}
for(int i=20;i>=0;--i){
if(dep[x]-_2[i]>=dep[y]){
x=f[x][i];
}
}
if(x==y){return y;}
for(int i=20;i>=0;--i){
if(dep[x]>_2[i]&&f[x][i]!=f[y][i]){
x=f[x][i];y=f[y][i];
}
}
return f[x][0];
}
int Query(int l,int r,int k,int p1,int p2,int p3,int p4){
if(l==r){
return l;
}
int mid=(l+r)>>1,sum=Siz(Son(p1,0))+Siz(Son(p2,0))-Siz(Son(p3,0))-Siz(Son(p4,0));
if(k<=sum){return Query(l,mid,k,Son(p1,0),Son(p2,0),Son(p3,0),Son(p4,0));}
else{return Query(mid+1,r,k-sum,Son(p1,1),Son(p2,1),Son(p3,1),Son(p4,1));}
}
signed main(){
// freopen("2.in","r",stdin);
// freopen("2.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
b[i]=a[i];
}
for(int i=1;i<n;++i){
int u,v;scanf("%d%d",&u,&v);
Add(u,v);Add(v,u);
}
sort(b+1,b+1+n);
tot=unique(b+1,b+1+n)-(b+1);
Dfs(1,0,1);
_2[0]=1;
for(int i=1;i<=25;++i){_2[i]=_2[i-1]*2;}
for(int i=1;i<=20;++i){
for(int j=1;j<=n;++j){
if(dep[j]-_2[i]<=0){continue;}
f[j][i]=f[f[j][i-1]][i-1];
}
}
int last=0;
while(m--){
int u,v,k;
scanf("%d%d%d",&u,&v,&k);
u=u^last;
int lca=Lca(u,v);
last=b[Query(1,tot,k,rt[u],rt[v],rt[lca],rt[f[lca][0]])];
printf("%d\n",last);
}
return 0;
}
/*
8 5
105 2 9 3 8 5 7 7
1 2
1 3
1 4
3 5
3 6
3 7
4 8
*/