#include <bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define FOR(i,l,r) for(int i=l;i<=r;++i)
#define ROF(i,r,l) for(int i=r;i>=l;--i)
#define mkp make_pair
#define fr first
#define se second
#define pb push_back
#define cmax(a,b) a=max(a,b)
#define cmin(a,b) a=min(a,b)
using namespace std;
void IOS() {
ios::sync_with_stdio(false);
cin.tie(0);
}
void Document() {
freopen("P2633_1.in","r",stdin);
}
inline int read(){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+(ch^48);ch=getchar();}
return s*w;
}
inline void write(int x){
if(x<0){putchar('-');x=-x;}
if(x>9) write(x/10);
putchar(x%10+'0');
}
void Tell() {
}
const int N=1e5+10;
int n,dp[N][30],b[N],lg,tot,m,q,a[N],root[N],dep[N];
vector<int>e[N];
struct Node {
int ls,rs;
int siz;
}rt;
vector<Node>t;
int Get(int x) {
return lower_bound(b+1,b+m+1,x)-b;
}
int Build(int nod) {
t.pb(rt);
t[++tot]=t[nod];
return tot;
}
int change(int p,int l,int r,int x,int v) {
p=Build(p);t[p].siz+=v;
if(l==r) return p;
int mid=l+r>>1,z;
if(x<=mid) z=change(t[p].ls,l,mid,x,v),t[p].ls=z;
else z=change(t[p].rs,mid+1,r,x,v),t[p].rs=z;
return p;
}
int ask(int x,int y,int lca,int fa,int k,int l,int r) {
if(l==r) return l;
int sum=t[t[x].ls].siz+t[t[y].ls].siz-t[t[fa].ls].siz-t[t[lca].ls].siz,mid=l+r>>1;
if(k<=sum) return ask(t[x].ls,t[y].ls,t[lca].ls,t[fa].ls,k,l,mid);
else return ask(t[x].rs,t[y].rs,t[lca].rs,t[fa].rs,k-sum,mid+1,r);
}
void dfs(int x,int fa) {
root[x]=change(root[fa],1,m,Get(a[x]),1);
dp[x][0]=fa;dep[x]=dep[fa]+1;
for(int i=1;i<=lg;++i) dp[x][i]=dp[dp[x][i-1]][i-1];
for(int y:e[x]) {
if(y==fa) continue;
dfs(y,x);
}
}
int lca(int x,int y) {
if(dep[x]<dep[y]) swap(x,y);
for(int i=lg;i>=0;--i) if(dep[dp[x][i]]>=dep[y]) x=dp[x][i];
if(x==y) return x;
for(int i=lg;i>=0;--i) if(dep[dp[x][i]]!=dep[dp[y][i]]) x=dp[x][i],y=dp[y][i];
return dp[x][0];
}
int lst;
main() {
t.pb(rt);
cin>>n>>q;lg=log(n)/log(2);
FOR(i,1,n) a[i]=read(),b[i]=a[i];
sort(b+1,b+n+1);
m=unique(b+1,b+n+1)-b-1;
FOR(i,1,n-1) {
int u=read(),v=read();
e[u].pb(v),e[v].pb(u);
}
dfs(1,0);
while(q--) {
int u=read(),v=read(),k=read();
u^=lst;
int la=lca(u,v);
lst=b[ask(root[u],root[v],root[la],root[dp[la][0]],k,1,m)];
printf("%d\n",lst);
}
return 0;
}