#include<bits/stdc++.h>
#define M 500005
using namespace std;
bool stt;
vector<int> v[M];
int fa[M], dep[M], hson[M], top[M], sz[M], lca[M], q, n, st[21][M], lg[M], tot, id[M], ans[M], tot1, tot2;
struct node{
int op, l, r, k, id;
}seq[M * 2], seq1[M * 2], seq2[M * 2];
void dfs(int x, int ft)
{
fa[x] = ft;
sz[x] = 1;
dep[x] = dep[ft] + 1;
for(auto t : v[x])
{
if(t == ft) continue;
dfs(t, x);
sz[x] += sz[t];
if(sz[t] > sz[hson[x]]) hson[x] = t;
}
}
void dfs1(int x, int tp)
{
top[x] = tp;
if(hson[x]) dfs1(hson[x], tp);
for(auto t : v[x]) if(t != hson[x] && t != fa[x]) dfs1(t, t);
}
int LCA(int x, int y)
{
while(top[x] != top[y])
{
if(dep[top[x]] < dep[top[y]]) y = fa[top[y]];
else x = fa[top[x]];
}
if(dep[x] > dep[y]) return y;
return x;
}
int qry(int l, int r)
{
int lgg = lg[r - l + 1];
return max(st[lgg][l], st[lgg][r - (1 << lgg) + 1]);
}
bool cmp7(int x, int y)
{
return dep[lca[x]] > dep[lca[y]];
}
struct BIT{
int a[M];
inline void add(int id, int x)
{
while(id < M) a[id] += x, id += id & (-id);
}
inline int query(int x)
{
int res = 0;
while(x) res += a[x], x -= x & (-x);
return res;
}
inline int query(int l, int r)
{
return query(r) - query(l - 1);
}
}bit;
struct BIT1{
int a[M];
inline void add(int id, int x)
{
while(id) a[id] = max(a[id], x), id -= id & (-id);
}
inline int query(int x)
{
int res = 0;
while(x < M) res = max(res, a[x]), x += x & (-x);
return res;
}
}bit1;
struct BIT2{
int a[M];
inline void add(int id, int x)
{
while(id < M) a[id] = max(a[id], x), id += id & (-id);
}
inline int query(int x)
{
int res = 0;
while(x) res = max(res, a[x]), x -= x & (-x);
return res;
}
}bit2;
struct BIT3{
int a[M], stk[30000005], num;
inline void add(int id, int x)
{
while(id < M) a[id] = max(a[id], x), stk[++num] = id, id += id & (-id);
}
inline int query(int x)
{
int res = 0;
while(x) res = max(res, a[x]), x -= x & (-x);
return res;
}
inline void clear()
{
while(num) a[stk[num--]] = 0;
}
}bit3;
bool cmp(node x, node y)
{
if(x.l != y.l) return x.l < y.l;
if(x.op != y.op) return x.op < y.op;
return x.r < y.r;
}
bool cmp1(node x, node y)
{
if(x.r != y.r) return x.r > y.r;
if(x.op != y.op) return x.op < y.op;
return x.l < y.l;
}
bool cmp2(node x, node y)
{
if(x.l != y.l) return x.l > y.l;
if(x.op != y.op) return x.op < y.op;
return x.r < y.r;
}
bool cmp3(node x, node y)
{
return x.r - x.l + 1 > y.r - y.l + 1;
}
bool cmp4(node x, node y)
{
return x.k > y.k;
}
void cdq(int l, int r)
{
if(l == r) return;
int mid = (l + r) >> 1;
cdq(l, mid);
cdq(mid + 1, r);
tot1 = 0, tot2 = 0;
for(int i = l; i <= mid; i++) if(seq[i].op == 0) seq1[++tot1] = seq[i];
for(int i = mid + 1; i <= r; i++) if(seq[i].op == 1) seq2[++tot2] = seq[i];
sort(seq1 + 1, seq1 + tot1 + 1, cmp3);
sort(seq2 + 1, seq2 + tot2 + 1, cmp4);
int j = 1;
for(int i = 1; i <= tot1; i++)
{
node now = seq1[i];
while(j <= tot2 && seq2[j].k > now.r - now.l + 1) ans[seq2[j].id] = max(ans[seq2[j].id], bit3.query(seq2[j].r)), j++;
bit3.add(now.r, now.k);
}
while(j <= tot2) ans[seq2[j].id] = max(ans[seq2[j].id], bit3.query(seq2[j].r)), j++;
bit3.clear();
}
bool en;
signed main()
{
freopen("query.in", "r", stdin);
freopen("query.out", "w", stdout);
scanf("%d", &n);
for(int i = 1, x, y; i < n; i++) scanf("%d%d", &x, &y), v[x].push_back(y), v[y].push_back(x);
dfs(1, 0);
dfs1(1, 1);
for(int i = 1; i < n; i++) lca[i] = LCA(i, i + 1);
for(int i = 1; i <= n; i++) st[0][i] = dep[i];
for(int i = 2; i <= n; i++) lg[i] = lg[i >> 1] + 1;
for(int i = 1; i <= 20; i++) for(int j = 1; j + (1 << i) - 1 <= n; j++) st[i][j] = max(st[i - 1][j], st[i - 1][j + (1 << i - 1)]);
scanf("%d", &q);
for(int i = 1, l, r, k; i <= q; i++)
{
scanf("%d%d%d", &l, &r, &k);
if(k == 1)
{
ans[i] = qry(l, r);
}
else
{
seq[++tot] = {1, l, r - 1, k - 1, i};
}
}
for(int i = 1; i < n; i++) id[i] = i;
sort(id + 1, id + n, cmp7);
for(int j = 1; j < n; j++)
{
int i = id[j];
bit.add(i, 1);
int l = 1, r = i - 1, mid, ans = i, tmp = bit.query(i - 1);
while(l <= r)
{
mid = (l + r) >> 1;
if(tmp - bit.query(mid - 1) == i - mid) ans = mid, r = mid - 1;
else l = mid + 1;
}
l = i + 1, r = n - 1;
int ans1 = i;
while(l <= r)
{
mid = (l + r) >> 1;
if(bit.query(mid) - tmp == mid - i + 1) ans1 = mid, l = mid + 1;
else r = mid - 1;
}
seq[++tot] = {0, ans, ans1, dep[lca[i]], 0};
}
sort(seq + 1, seq + tot + 1, cmp);
for(int i = 1; i <= tot; i++)
{
node now = seq[i];
if(now.op == 1)
{
int mr = now.l + now.k - 1;
ans[now.id] = max(ans[now.id], bit1.query(mr));
}
else
{
bit1.add(now.r, now.k);
}
}
sort(seq + 1, seq + tot + 1, cmp1);
for(int i = 1; i <= tot; i++)
{
node now = seq[i];
if(now.op == 1)
{
int ml = now.r - now.k + 1;
ans[now.id] = max(ans[now.id], bit2.query(ml));
}
else
{
bit2.add(now.l, now.k);
}
}
sort(seq + 1, seq + tot + 1, cmp2);
cdq(1, tot);
for(int i = 1; i <= q; i++) printf("%d\n", ans[i]);
return 0;
}