#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 1e5 + 1;
struct T {
int v, l, r;
} t[N * 100];
int n, m, k, u, v, f[N][25], d[N], ans, a[N], b[N], rt[N], nc, q;
vector<int> e[N];
void Build(int &i, int l, int r) {
i = ++nc;
if (l != r) {
int m = l + r >> 1;
Build(t[i].l, l, m);
Build(t[i].r, m + 1, r);
}
}
void Modify(int i, int &_i, int l, int r, int p) {
_i = ++nc;
t[_i] = t[i], t[_i].v++;
if (l == r) {
return;
}
int m = l + r >> 1;
p <= m ? Modify(t[i].l, t[_i].l, l, m, p) : Modify(t[i].r, t[_i].r, m + 1, r, p);
}
void Dfs(int x, int fa) {
Modify(rt[fa], rt[x], 1, q, lower_bound(b + 1, b + q + 1, a[x]) - b);
f[x][0] = fa, d[x] = d[fa] + 1;
for (int i = 1; i <= 20; ++i) {
f[x][i] = f[f[x][i - 1]][i - 1];
}
for (int i : e[x]) {
if (i != fa) {
Dfs(i, x);
}
}
}
int Lca(int u, int v) {
if (d[u] < d[v]) {
swap(u, v);
}
for (int i = 20; i >= 0; --i) {
if (d[f[u][i]] >= d[v]) {
u = f[u][i];
}
}
if (u == v) {
return u;
}
for (int i = 20; i >= 0; --i) {
if (f[u][i] != f[v][i]) {
u = f[u][i], v = f[v][i];
}
}
return f[u][0];
}
int Query(int x, int y, int z, int w, int l, int r, int k) {
if (l == r) {
return l;
}
int s = t[t[x].l].v + t[t[y].l].v - t[t[z].l].v - t[t[w].l].v, m = l + r >> 1;
return k <= s ? Query(t[x].l, t[y].l, t[z].l, t[w].l, l, m, k) : Query(t[x].r, t[y].r, t[z].r, t[w].r, m + 1, r, k - s);
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
b[i] = a[i];
}
for (int i = 1; i < n; ++i) {
cin >> u >> v;
e[u].emplace_back(v), e[v].emplace_back(u);
}
sort(b + 1, b + n + 1);
q = unique(b + 1, b + n + 1) - b - 1;
Build(rt[0], 1, q);
Dfs(1, 0);
for (int i = 1; i <= m; ++i) {
cin >> u >> v >> k;
int lca = Lca(u, v);
cout << (ans = b[Query(rt[u ^ ans], rt[v], rt[lca], rt[f[lca][0]], 1, q, k)]) << '\n';
}
return 0;
}