#include<bits/stdc++.h>
#define IL inline
#define FOR(i, s, t) for(int i = (s); i <= (t); ++i)
#define ROF(i, s, t) for(int i = (s); i >= (t); --i)
#define pii pair<int, int>
#define mkp make_pair
#define fi first
#define se second
#define pb push_back
#define ls (x << 1)
#define rs ((x << 1) | 1)
#define mid ((l + r) >> 1)
using namespace std;
const int N = 5e5 + 5;
struct xld {
int l, r, d, be, ed;
};
struct req {
int l, r, k;
};
struct df {
int lx, a, b, c, id;
};
int n, Q;
vector<int> V[N];
int dfn[N], dep[N], cc = 0;
int Ansn[N];
xld st[N], dd[N << 2];
req que[N];
df so[N << 2];
int nw = 0, tot = 0;
IL int chkmn(int x, int y) {
return (dep[x] < dep[y] ? x : y);
}
struct seg {
int t[N << 2];
IL void pp(int x) {return t[x] = max(t[ls], t[rs]), void();}
IL void build(int x, int l, int r) {
if(l == r) return t[x] = 0, void();
build(ls, l, mid), build(rs, mid + 1, r);
return pp(x);
}
IL void update(int x, int l, int r, int p, int k) {
if(l == r) return t[x] = k, void();
if(p <= mid) update(ls, l, mid, p, k);
else update(rs, mid + 1, r, p, k);
return pp(x);
}
IL int query(int x, int l, int r, int a, int b) {
if(a <= l && b >= r) return t[x];
int res = 0;
if(a <= mid) res = max(res, query(ls, l, mid, a, b));
if(b > mid) res = max(res, query(rs, mid + 1, r, a, b));
return res;
}
}s;
struct LC {
int ST[20][N], Lg[N];
IL void prework() {
FOR(i, 2, N - 5) Lg[i] = Lg[i >> 1] + 1;
return;
}
IL void build() {
prework();
FOR(j, 1, 19) FOR(i, 1, n - (1 << j) + 1) ST[j][i] = chkmn(ST[j - 1][i], ST[j - 1][i + (1 << (j - 1))]);
return;
}
IL int query(int l, int r) {
int t = Lg[r - l + 1];
return chkmn(ST[t][l], ST[t][r - (1 << t) + 1]);
}
IL int LCA(int x, int y) {
if(x == y) return x;
if((x = dfn[x]) > (y = dfn[y])) swap(x, y);
return query(x + 1, y);
}
}L;
IL void dfs(int x, int fa) {
dfn[x] = ++cc; L.ST[0][cc] = fa; dep[x] = dep[fa] + 1;
for(int v : V[x]) if(v != fa) dfs(v, x);
return;
}
int main() {
freopen("query.in", "r", stdin);
freopen("query.out", "w", stdout);
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n;
FOR(i, 1, n - 1) {
int u, v; cin >> u >> v;
V[u].pb(v), V[v].pb(u);
} dfs(1, 0); L.build();
st[++nw] = (xld){1, 1, 1, 1, 0};
FOR(i, 2, n) {
int l = 1, r = nw, midn, ansn = 0;
while(l <= r) {
midn = (l + r) >> 1; int nd = st[midn].d, lc = L.LCA(nd, i);
if(chkmn(nd, lc) == lc && lc != nd) ansn = midn, r = midn - 1;
else l = midn + 1;
}
if(ansn == 0) {
st[++nw] = (xld){i, i, i, i, 0};
continue;
} int ll = 0, rr = i - 1, lc = i;
while(nw >= ansn) st[nw].ed = i - 1, ll = st[nw].l, lc = L.LCA(st[nw].d, i), dd[++tot] = st[nw--];
st[++nw] = (xld){ll, rr, lc, i, 0}; st[++nw] = (xld){i, i, i, i, 0};
}
while(nw) st[nw].ed = n, dd[++tot] = st[nw--]; cin >> Q;
FOR(i, 1, Q) {
int l, r, k; cin >> l >> r >> k;
que[i] = (req){l, r, k}; so[i] = (df){1, l, l + k - 1, 0, i};
}
FOR(i, 1, tot) so[i + Q] = (df){0, dd[i].l, dd[i].ed, 0, dep[dd[i].d]}; s.build(1, 1, n);
sort(so + 1, so + Q + tot + 1, [&](df A, df B){return (A.a == B.a ? A.lx < B.lx : A.a < B.a);});
FOR(i, 1, Q + tot) {
int lx = so[i].lx, b = so[i].b, id = so[i].id;
if(!lx) s.update(1, 1, n, b, id);
else Ansn[id] = max(Ansn[id], s.query(1, 1, n, b, n));
}
FOR(i, 1, Q) {
int l = que[i].l, r = que[i].r, k = que[i].k;
so[i] = (df){1, r - k + 1, r, 0, i};
}
FOR(i, 1, tot) so[i + Q] = (df){0, dd[i].l, dd[i].ed, 0, dep[dd[i].d]}; s.build(1, 1, n);
sort(so + 1, so + Q + tot + 1, [&](df A, df B){return (A.a == B.a ? A.lx < B.lx : A.a < B.a);});
FOR(i, 1, Q + tot) {
int lx = so[i].lx, b = so[i].b, id = so[i].id;
if(!lx) s.update(1, 1, n, b, id);
else Ansn[id] = max(Ansn[id], s.query(1, 1, n, b, n));
} s.build(1, 1, n);
FOR(i, 1, Q) {
int l = que[i].l, r = que[i].r, k = que[i].k;
so[i] = (df){1, k - 1, l + k - 1, r, i};
}
FOR(i, 1, tot) so[i + Q] = (df){0, dd[i].ed - dd[i].l, max(dd[i].l, dd[i].ed), 0, dep[dd[i].d]};
sort(so + 1, so + Q + tot + 1, [&](df A, df B){return (A.a == B.a ? A.lx < B.lx : A.a > B.a);});
FOR(i, 1, Q + tot) {
int lx = so[i].lx, b = so[i].b, c = so[i].c, id = so[i].id;
if(!lx) s.update(1, 1, n, b, id);
else Ansn[id] = max(Ansn[id], s.query(1, 1, n, b, c));
}
FOR(i, 1, Q) cout << Ansn[i] << '\n';
return 0;
}