#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
using i128 = __int128;
using u128 = unsigned __int128;
template <typename T>
void chkmax(T &x, const T &y) {
x = max(x, y);
}
template <typename T>
void chkmin(T &x, const T &y) {
x = min(x, y);
}
constexpr int MAXN = 5e5 + 10;
int n, dep[MAXN], val[MAXN], q, ans[MAXN], mx[19][MAXN], mn[19][MAXN];
int ord[MAXN], rk[MAXN], pre[MAXN], nxt[MAXN];
tuple<int, int, int> qry[MAXN];
vector<int> g[MAXN];
vector<tuple<int, int, int>> buc1[MAXN];
vector<pair<int, int>> buc2[MAXN];
bool cmp(int x, int y) { return rk[x] < rk[y]; }
namespace dsu {
int fa[MAXN];
void init() { iota(fa + 1, fa + n + 1, 1); }
int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); }
}
void dfs(int u, int fa) {
dep[u] = dep[fa] + 1;
for (auto v : g[u]) {
if (v == fa) continue;
dfs(v, u);
dsu::fa[v] = u;
}
for (auto i : {u - 1, u + 1}) {
if (i >= 1 && i <= n && dsu::fa[i] != i)
val[max(i, u)] = dep[dsu::find(i)];
}
}
int get_max(int l, int r) {
int k = __lg(r - l + 1);
return max(mx[k][l], mx[k][r - (1 << k) + 1]);
}
int get_min(int l, int r) {
int k = __lg(r - l + 1);
return min(mn[k][l], mn[k][r - (1 << k) + 1], cmp);
}
namespace sgt {
int mx[MAXN * 4];
int ls(int p) { return p << 1; }
int rs(int p) { return p << 1 | 1; }
void update(int p, int l, int r, int x, int y) {
chkmax(mx[p], y);
if (l == r) return;
int mid = (l + r) >> 1;
if (x <= mid) {
update(ls(p), l, mid, x, y);
} else {
update(rs(p), mid + 1, r, x, y);
}
}
int query(int p, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr) return mx[p];
int mid = (l + r) >> 1;
if (qr <= mid) return query(ls(p), l, mid, ql, qr);
if (ql > mid) return query(rs(p), mid + 1, r, ql, qr);
return max(query(ls(p), l, mid, ql, qr), query(rs(p), mid + 1, r, ql, qr));
}
}
int main() {
freopen("query.in", "r", stdin);
freopen("query.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 1, u, v; i < n; ++i) {
cin >> u >> v;
g[u].emplace_back(v);
g[v].emplace_back(u);
}
dsu::init();
dfs(1, 0);
for (int i = 1; i <= n; ++i) {
mx[0][i] = dep[i];
mn[0][i] = i;
ord[i] = i;
pre[i] = i - 1;
nxt[i] = i + 1;
}
sort(ord + 1, ord + n + 1, [](int x, int y) { return val[x] < val[y]; });
for (int i = 1; i <= n; ++i) rk[ord[i]] = i;
for (int i = 1; 1 << i <= n; ++i) {
for (int j = 1; j + (1 << i) - 1 <= n; ++j) {
mx[i][j] = max(mx[i - 1][j], mx[i - 1][j + (1 << (i - 1))]);
mn[i][j] = min(mn[i - 1][j], mn[i - 1][j + (1 << (i - 1))], cmp);
}
}
cin >> q;
for (int i = 1, l, r, k; i <= q; ++i) {
cin >> l >> r >> k;
if (k == 1) {
ans[i] = get_max(l, r);
continue;
}
--k;
++l;
int id1 = get_min(l, l + k - 1), id2 = get_min(r - k + 1, r);
ans[i] = max(val[id1], val[id2]);
if (id1 < id2) buc1[k + 1].emplace_back(id1 + 1, id2, i);
qry[i] = {l, r, k};
}
for (int i = n, u; i >= 2; --i) {
u = ord[i];
int x = pre[u], y = nxt[u];
nxt[x] = y;
pre[y] = x;
if (x >= 2 && y <= n) buc2[y - x].emplace_back(y, val[u]);
}
for (int i = n; i >= 1; --i) {
for (auto &j : buc2[i]) sgt::update(1, 1, n, j.first, j.second);
for (auto &j : buc1[i])
chkmax(ans[get<2>(j)], sgt::query(1, 1, n, get<0>(j), get<1>(j)));
}
for (int i = 1; i <= q; ++i) cout << ans[i] << "\n";
return 0;
}