#include <bits/stdc++.h>
using namespace std;
void chkmax(int &x, int y) {x = (x < y ? y : x);}
int n, Q, sz[500010], son[500010], dep[500010], ans[500010];
vector<int> a[500010];
vector<pair<int, int>> ask1[500010], ch1[500010], ch2[500010];
vector<array<int, 3>> ask2[500010];
void init(int now, int fa) {
sz[now] = 1;
int mx = 0;
for (int v : a[now]) {
if (v == fa) continue;
init(v, now), sz[now] += sz[v];
if (sz[v] > mx) mx = sz[v], son[now] = v;
}
}
int b[500010], fa[500010], l[500010], r[500010];
int findf(int x) {return x == fa[x] ? x : (fa[x] = findf(fa[x]));}
vector<int> re;
void add(int x, int val) {
re.push_back(x), b[x] = 1;
if (b[x - 1]) r[fa[x] = findf(x - 1)] = x;
if (b[x + 1]) {
int y = findf(x + 1);
r[findf(x)] = r[y], fa[y] = findf(x);
}
int ll = l[findf(x)], rr = r[findf(x)];
ch1[ll].push_back({rr, val});
ch2[rr - ll + 1].push_back({ll, val});
}
void dadd(int now, int fa, int val) {
add(now, val);
for (int v : a[now])
if (v != fa) dadd(v, now, val);
}
void dfs(int now, int fath, int flag) {
dep[now] = dep[fath] + 1;
for (int v : a[now])
if (v != fath && v != son[now])
dfs(v, now, 1);
if (son[now]) dfs(son[now], now, 0);
add(now, dep[now]);
for (int v : a[now])
if (v != fath && v != son[now])
dadd(v, now, dep[now]);
if (flag) {
while (!re.empty()) {
int x = re.back(); re.pop_back();
b[x] = 0, fa[x] = l[x] = r[x] = x;
}
}
}
struct BIT {
int t[500010];
void add(int x, int y) {
for (; x <= n; x += x & -x)
chkmax(t[x], y);
}
int query(int x, int res = 0) {
for (; x; x -= x & -x)
chkmax(res, t[x]);
return res;
}
} T1;
#define mid ((l + r) >> 1)
#define lson (now << 1)
#define rson (now << 1 | 1)
struct Segtree {
int t[500010 << 2];
void add(int now, int x, int y, int l = 1, int r = n) {
chkmax(t[now], y);
if (l == r) return;
if (x <= mid) add(lson, x, y, l, mid);
else add(rson, x, y, mid + 1, r);
}
int query(int now, int ql, int qr, int l = 1, int r = n) {
if (ql <= l && qr >= r) return t[now];
int res = 0;
if (ql <= mid) res = query(lson, ql, qr, l, mid);
if (qr > mid) chkmax(res, query(rson, ql, qr, mid + 1, r));
return res;
}
} T2;
signed main() {
freopen("query.in", "r", stdin);
freopen("query.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n;
for (int i = 1; i < n; i++) {
int u, v;
cin >> u >> v;
a[u].push_back(v), a[v].push_back(u);
}
cin >> Q;
for (int i = 1; i <= Q; i++) {
int l, r, k;
cin >> l >> r >> k;
ask1[l].push_back({l + k - 1, i});
ask2[k].push_back({l, r - k + 1, i});
}
init(1, 0);
for (int i = 1; i <= n; i++)
fa[i] = l[i] = r[i] = i;
dfs(1, 0, 0);
for (int i = 1; i <= n; i++) {
for (auto x : ch1[i])
T1.add(n - x.first + 1, x.second);
for (auto x : ask1[i])
chkmax(ans[x.second], T1.query(n - x.first + 1));
}
for (int i = n; i >= 1; i--) {
for (auto x : ch2[i])
T2.add(1, x.first, x.second);
for (auto x : ask2[i])
chkmax(ans[x[2]], T2.query(1, x[0], x[1]));
}
for (int i = 1; i <= Q; i++)
cout << ans[i] << "\n";
return 0;
}