#include<iostream>
#include<vector>
#include<algorithm>
int n, f[30][500005], dep[500005];
std::vector<int> e[500005];
void dfs(int u, int par) {
f[0][u] = par;
for (int i = 1; i <= 20; i++) {
f[i][u] = f[i - 1][f[i - 1][u]];
}
for (int v : e[u]) {
if (v == par) continue;
dep[v] = dep[u] + 1, dfs(v, u);
}
}
int LCA(int u, int v) {
if (dep[u] > dep[v]) std::swap(u, v);
for (int i = 20; i >= 0; i--) {
if (dep[f[i][v]] >= dep[u]) v = f[i][v];
}
if (u == v) return u;
for (int i = 20; i >= 0; i--) {
if (f[i][u] != f[i][v]) u = f[i][u], v = f[i][v];
}
return f[0][u];
}
int a[500005];
int ST[30][500005], q, ql[500005], qr[500005], qk[500005], ans[500005];
int STD[30][500005], sta[500005], L[500005], R[500005];
int A[4000006], top;
std::vector<int> Q[500005], V[500005];
void modify(int u, int l, int r, int k, int d) {
if (l == r) return A[u] = d, void();
int mid = (l + r) >> 1;
if (k <= mid) modify(u << 1, l, mid, k, d);
else modify(u << 1 | 1, mid + 1, r, k, d);
A[u] = std::max(A[u << 1], A[u << 1 | 1]);
}
int ask(int u, int l, int r, int L, int R) {
if (l >= L && r <= R) return A[u];
if (r < L || l > R) return 0;
int mid = (l + r) >> 1;
return std::max(ask(u << 1, l, mid, L, R), ask(u << 1 | 1, mid + 1, r, L, R));
}
int ask(int l, int r) {
int t = __builtin_log2(r - l + 1);
return std::min(ST[t][l], ST[t][r - (1 << t) + 1]);
}
int askd(int l, int r) {
int t = __builtin_log2(r - l + 1);
return std::max(STD[t][l], STD[t][r - (1 << t) + 1]);
}
int main() {
freopen("query.in", "r", stdin);
freopen("query.out", "w", stdout);
std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);
std::cin >> n;
for (int i = 1; i < n; i++) {
int u, v; std::cin >> u >> v;
e[u].push_back(v), e[v].push_back(u);
}
dep[1] = 1, dfs(1, 1);
for (int i = 1; i < n; i++) a[i] = dep[LCA(i, i + 1)];
for (int i = 1; i < n; i++) ST[0][i] = a[i];
for (int i = 1; i <= n; i++) STD[0][i] = dep[i];
for (int i = 1; i <= 20; i++) {
for (int j = 1; j + (1 << i) <= n; j++) {
ST[i][j] = std::min(ST[i - 1][j], ST[i - 1][j + (1 << (i - 1))]);
}
for (int j = 1; j + (1 << i) <= n + 1; j++) {
STD[i][j] = std::max(STD[i - 1][j], STD[i - 1][j + (1 << (i - 1))]);
}
}
std::cin >> q;
for (int i = 1; i <= q; i++) {
std::cin >> ql[i] >> qr[i] >> qk[i], qk[i]--, qr[i]--;
if (qk[i] == 0) {
ans[i] = askd(ql[i], qr[i] + 1);
continue;
}
ans[i] = std::max(ask(qr[i] - qk[i] + 1, qr[i]), ask(ql[i], ql[i] + qk[i] - 1));
Q[qk[i]].push_back(i);
}
sta[++top] = 0;
for (int i = 1; i <= n; i++) {
while (a[sta[top]] > a[i]) R[sta[top--]] = i - 1;
L[i] = sta[top] + 1, sta[++top] = i;
}
for (int i = 1; i <= n; i++) V[R[i] - L[i] + 1].push_back(i);
for (int i = n - 1; i >= 1; i--) {
for (int j : V[i]) {
modify(1, 1, n - 1, R[j], a[j]);
}
for (int j : Q[i]) {
ans[j] = std::max(ans[j], ask(1, 1, n - 1, ql[j] + qk[j] - 1, qr[j]));
}
}
for (int i = 1; i <= q; i++) std::cout << ans[i] << '\n';
}