#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5;
int n,m,a[N];
map<int,int>mp;
int sl[N<<6],sr[N<<6],sum[N<<6],tot,siz,u,v,k,last=0;
vector<int>g[N];
int f[N],root[N],dep[N];
int pa[N][25];
int build(int l,int r)
{
int u=++tot;
sum[u]=0;
if(l<r)
{
int mid=(l+r)/2;
sl[u]=build(l,mid);
sr[u]=build(mid+1,r);
}
return u;
}
int insert(int x,int l,int r,int pos)
{
int u=++tot;
sl[u]=sl[x],sr[u]=sr[x],sum[u]=sum[x]+1;
if(l<r)
{
int mid=(l+r)/2;
if(pos<=mid)sl[u]=insert(sl[x],l,mid,pos);
else sr[u]=insert(sr[x],mid+1,r,pos);
}
return u;
}
void dfs(int x,int fa)
{
pa[x][0]=fa;
for(int i=1;i<=20;i++)pa[x][i]=pa[pa[x][i-1]][i-1];
root[x]=insert(root[fa],1,siz,a[x]);
for(auto i:g[x])
{
if(i==fa)continue;
dep[i]=dep[x]+1;
dfs(i,x);
}
}
int lca(int x,int y)
{
if(dep[x]<dep[y])swap(x,y);
int tmp=dep[x]-dep[y];
for(int i=20;i>=0;i--)if((tmp>>i)&1)x=pa[x][i];
if(x==y)return x;
for(int i=20;i>=0;i--)
{
if(pa[x][i]!=pa[y][i])
{
x=pa[x][i];
y=pa[y][i];
}
}
return pa[x][0];
}
int query(int x,int y,int u,int v,int k,int l,int r)
{
if(l==r)return l;
int s=sum[sl[u]]+sum[sl[v]]-sum[sl[x]]-sum[sl[y]];
int mid=(l+r)/2;
if(s<k)return query(sr[x],sr[y],sr[u],sr[v],k-s,mid+1,r);
else return query(sl[x],sl[y],sl[u],sl[v],k,l,mid);
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i],mp[a[i]]=1;
for(auto &i:mp)i.second=++siz,f[siz]=i.first;
for(int i=1;i<=n;i++)a[i]=mp[a[i]];
for(int i=1;i<n;i++)
{
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
root[0]=build(1,siz);
dfs(1,0);
while(m--)
{
cin>>u>>v>>k;
u^=last;
int op=lca(u,v);
last=f[query(root[pa[op][0]],root[op],root[u],root[v],k,1,siz)];
cout<<last<<"\n";
}
return 0;
}