#include <iostream>
#include <vector>
#include <algorithm>
#define ai_jiang signed main()
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define drep(a,b,c) for(int a=b;a>=c;a--)
#define all(a) a.begin(),a.end()
#define id(x) ((lower_bound(a.begin(),a.end(),x)-a.begin())+1)
#define ll long long
using namespace std;
using poly=vector<ll>;
namespace ai {
constexpr int N = 1e5+5;
int n,m,w[N],dfn[N],fa[N],top[N],siz[N],hs[N],dep[N],rt[N<<1],tot,nodetot,lst,x,y,lca;
vector<int> e[N];
vector<int> a;
void dfs1(int u,int f) {
fa[u]=f;
dep[u]=dep[f]+1;
dfn[u]=++tot;
siz[u]=1;
for(auto v:e[u]) {
if(v==f) continue;
dfs1(v,u);
siz[u]+=siz[v];
if(siz[v]>siz[hs[u]]) hs[u]=v;
}
}
void dfs2(int u,int t) {
top[u]=t;
if(!hs[u]) return;
dfs2(hs[u],t);
for(auto v:e[u]) {
if(v==fa[u]||v==hs[u]) continue;
dfs2(v,v);
}
}
int la(int x,int y) {
while(dep[top[x]]!=dep[top[y]]) {
if(dep[top[x]]<dep[top[y]]) swap(x,y);
x=fa[top[x]];
} return dep[x]<dep[y]?x:y;
}
struct node {
int v,s[2];
} tr[N*(__lg(N)+2)];
#define lc(x) tr[x].s[0]
#define rc(x) tr[x].s[1]
void insert(int x,int &y,int l,int r,int v) {
y=++nodetot; tr[y]=tr[x]; tr[y].v++;
if(l==r) return;
int mid=l+r>>1;
if(v<=mid) insert(lc(x),lc(y),l,mid,v);
else insert(rc(x),rc(y),mid+1,r,v);
}
int qry(int x,int l,int r,int L,int R) {
if(L<=l&&r<=R) return tr[x].v;
int mid=l+r>>1;
if(L<=mid) return qry(lc(x),l,mid,L,R);
if(R>mid) return qry(rc(x),mid+1,r,L,R);
}
int query(int p,int l,int r,int k) {
if(l==r) return a[l-1];
int mid=l+r>>1;
int s=qry(rt[dfn[x]],1,a.size(),l,mid)-qry(rt[dfn[fa[lca]]],1,a.size(),l,mid)+qry(rt[dfn[y]],1,a.size(),l,mid)-qry(rt[dfn[lca]],1,a.size(),l,mid);
if(k<=s) return query(lc(p),l,mid,k);
else return query(rc(p),mid+1,r,k-s);
}
void dfs(int u,int f) {
insert(rt[dfn[f]],rt[dfn[u]],1,a.size(),id(w[u]));
for(auto v:e[u]) {
if(v==f) continue;
dfs(v,u);
}
}
}
using namespace ai;
ai_jiang {
cin.tie(0); cout.tie(0);
cin>>n>>m;
rep(i,1,n) cin>>w[i],a.push_back(w[i]);
sort(all(a));
a.erase(unique(a.begin(),a.end()),a.end());
rep(i,1,n-1) {
int xx,yy; cin>>xx>>yy;
e[xx].push_back(yy);
e[yy].push_back(xx);
}
dfs1(1,0);
dfs2(1,1);
dfs(1,0);
rep(i,1,m) {
int u,v,k;
cin>>u>>v>>k; u^=lst; x=u,y=v,lca=la(x,y);
cout<<(lst=query(1,1,a.size(),k))<<'\n';
}
return 0;
}