#include <cstdio>
#include <vector>
#include <algorithm>
inline void cmx(int &x, const int y) {if (x < y) x = y;}
int ls[12000005], rs[12000005], pr[12000005], sf[12000005], dep[500005], dfn[500005], out[500005], tot, n, q;
int rt[500005], ans[500005], timer, nowval;
std::vector<int> G[500005];
bool sub(int u, int v) {return dfn[u] <= dfn[v] && dfn[v] <= out[u];}
struct Segment_tree {
struct node {int l, r, mx;} tr[2000005];
void build(int p, int l, int r) {
tr[p].l = l, tr[p].r = r, tr[p].mx = 0;
if (l != r) build(p << 1, l, l + r >> 1), build(p << 1 | 1, (l + r >> 1) + 1, r);
}
void upd(int x, int y) {
int p = 1;
while (tr[p].l < tr[p].r) {
int mid = tr[p].l + tr[p].r >> 1; cmx(tr[p].mx, y);
x <= mid ? p <<= 1 : p = p << 1 | 1;
}
cmx(tr[p].mx, y);
}
int qry(int p, int l, int r) {
if (l <= tr[p].l && tr[p].r <= r) return tr[p].mx;
int mid = tr[p].l + tr[p].r >> 1, mx = 0;
if (l <= mid) mx = qry(p << 1, l, r);
if (mid < r) cmx(mx, qry(p << 1 | 1, l, r));
return mx;
}
} sgt;
struct Genshin {
struct node {
int l, r, y, id;
inline bool operator < (const node &rhs) const {return y ^ rhs.y ? y > rhs.y : id < rhs.id;}
} p[2000005];
int tot;
inline void add(int x, int y, int v) {p[++ tot] = node{x, v, y, 0};}
inline void qry(int l, int r, int y, int id) {p[++ tot] = node{l, r, y, id};}
void run() {
std::sort(p + 1, p + tot + 1), sgt.build(1, 1, n);
for (int i = 1; i <= tot; ++ i)
if (!p[i].id) sgt.upd(p[i].l, p[i].r);
else cmx(ans[p[i].id], sgt.qry(1, p[i].l, p[i].r));
}
} pl1, pl2;
void addinterval(int l, int r) {pl1.add(l, r, nowval), pl2.add(l, r - l + 1, nowval);}
inline void pushup(int p, int len) {
pr[p] = pr[ls[p]] + (pr[ls[p]] == (len + 1 >> 1)) * pr[rs[p]];
sf[p] = sf[rs[p]] + (sf[rs[p]] == (len >> 1)) * sf[ls[p]];
}
void insert(int &p, int l, int r, int x) {
if (!p) p = ++ tot;
if (l == r) {pr[p] = sf[p] = 1; return;}
int mid = l + r >> 1;
x <= mid ? insert(ls[p], l, mid, x) : insert(rs[p], mid + 1, r, x);
pushup(p, r - l + 1);
}
void merge(int &u, int v, int l, int r) {
if (!u || !v) {u |= v; return;}
int x1 = sf[ls[u]], y1 = pr[rs[u]], x2 = sf[ls[v]], y2 = pr[rs[v]], mid = l + r >> 1;
merge(ls[u], ls[v], l, mid), merge(rs[u], rs[v], mid + 1, r);
pushup(u, r - l + 1);
int x = sf[ls[u]], y = pr[rs[u]];
if (!(x1 == x && y1 == y) && !(x2 == x && y2 == y) && x != mid - l + 1 && y != r - mid)
addinterval(mid - x + 1, mid + y);
}
void dfs(int u, int fa) {
dfn[u] = ++ timer, insert(rt[u], 0, n + 1, u);
for (int v : G[u]) if (v != fa) dep[v] = dep[u] + 1, dfs(v, u), nowval = dep[u], merge(rt[u], rt[v], 0, n + 1);
out[u] = timer;
if (!sub(u, u - 1) && !sub(u, u + 1)) nowval = dep[u], addinterval(u, u);
}
int main() {
freopen("query.in", "r", stdin);
freopen("query.out", "w", stdout);
scanf("%d", &n);
for (int i = 1, u, v; i < n; ++ i) scanf("%d%d", &u, &v), G[u].push_back(v), G[v].push_back(u);
dep[1] = 1, dfs(1, -1);
scanf("%d", &q);
for (int i = 1, l, r, k; i <= q; ++ i)
scanf("%d%d%d", &l, &r, &k), pl1.qry(1, l, l + k - 1, i), pl2.qry(l, r - k + 1, k, i);
pl1.run(), pl2.run();
for (int i = 1; i <= q; ++ i) printf("%d\n", ans[i]);
return 0;
}