#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define endl "\n"
#define int long long
const int N = 111115;
const int LG = log2(N) + 1;
int n, q, ct = 0, num = 0;
int a[N], root[N], level[N];
int st[21*N], lc[21*N], rc[21*N];
int tim=0;
int parent[LG][N];
map<int, int> comp, rcomp;
vector<int> g[N];
void dfs0(int k, int par, int lvl)
{
parent[0][k] = par;
level[k] = lvl;
for(auto it:g[k])
{
if(it==par)
continue;
dfs0(it, k, lvl+1);
}
}
void precompute()
{
for(int i=1;i<LG;i++)
for(int j=1;j<=n;j++)
if(parent[i-1][j])
parent[i][j]=parent[i-1][parent[i-1][j]];
}
int LCA(int u, int v)
{
if(level[u]<level[v])
swap(u,v);
int diff=level[u]-level[v];
for(int i=LG-1;i>=0;i--)
{
if((1<<i) & diff)
{
u=parent[i][u];
}
}
if(u==v)
return u;
for(int i=LG-1;i>=0;i--)
{
if(parent[i][u] && parent[i][u]!=parent[i][v])
{
u=parent[i][u];
v=parent[i][v];
}
}
return parent[0][u];
}
int build(int L, int R)
{
int node = ++ct;
if(L==R)
return node;
int M = (L+R)/2;
lc[node] = build(L, M);
rc[node] = build(M+1, R);
return node;
}
int update(int onode, int L, int R, int pos)
{
int node = ++ct;
if(L==R)
{
st[node] = st[onode] + 1;
return node;
}
int M = (L+R)/2;
lc[node] = lc[onode];
rc[node] = rc[onode];
if(pos <= M)
lc[node] = update(lc[onode], L, M, pos);
else
rc[node] = update(rc[onode], M+1, R, pos);
st[node] = st[lc[node]] + st[rc[node]];
return node;
}
int query(int nodeu, int nodev, int nodelca, int nodelcapar, int L, int R, int pos)
{
if(L==R)
return L;
int M = (L+R)/2;
int leftval = st[lc[nodeu]] + st[lc[nodev]] - st[lc[nodelca]] - st[lc[nodelcapar]];
int rightval = st[rc[nodeu]] + st[rc[nodev]] - st[rc[nodelca]] - st[rc[nodelcapar]];
if(leftval>=pos)
return query(lc[nodeu], lc[nodev], lc[nodelca], lc[nodelcapar], L, M, pos);
else
return query(rc[nodeu], rc[nodev], rc[nodelca], rc[nodelcapar], M+1, R, pos-leftval);
}
void dfs(int u, int par)
{
int onode = root[par];
root[u] = update(onode, 1, num, a[u]);
for(auto &it:g[u])
{
if(it==par)
continue;
dfs(it, u);
}
}
int32_t main()
{
IOS;
cin>>n>>q;
for(int i=1;i<=n;i++)
{
cin>>a[i];
comp[a[i]];
}
for(auto &it:comp)
{
it.second = ++num;
rcomp[num] = it.first;
}
for(int i=1;i<=n;i++)
a[i] = comp[a[i]];
for(int i=1;i<=n-1;i++)
{
int u, v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
root[0] = build(1, num);
dfs0(1, 0, 1);
precompute();
dfs(1, 0);
while(q--)
{
int u, v, k;
cin>>u>>v>>k;
int lca = LCA(u, v);
int parlca = parent[0][lca];
int value = query(root[u], root[v], root[lca], root[parlca], 1, num, k);
int ans = rcomp[value];
cout<<ans<<endl;
}
return 0;
}