#include<bits/stdc++.h>
#define LL long long
#define mes(s, x) memset(s, x, sizeof s)
#define Maxn 500005
#define tlc i << 1
#define trc (i << 1) | 1
#define bmid int mid = (l[i] + r[i]) >> 1
using namespace std;
int read(){
char c = getchar();
while(!('0' <= c && c <= '9')) c = getchar();
int tot = 0;
while('0' <= c && c <= '9'){
tot = 10 * tot + c - '0';
c = getchar();
}
return tot;
}
vector<int> g[Maxn];
int fa[20][Maxn], dep[Maxn];
void dfs(int i){
for(int j = 1; 1 << j <= dep[i]; j++) fa[j][i] = fa[j - 1][fa[j - 1][i]];
for(int j: g[i]){
if(fa[0][i] == j) continue;
fa[0][j] = i;
dep[j] = dep[i] + 1;
dfs(j);
}
}
int kfa(int i, int k){
if(!k) return i;
for(int j = __lg(k); j >= 0; j--) if((k >> j) & 1) i = fa[j][i];
return i;
}
int lca(int i, int j){
if(dep[i] < dep[j]) swap(i, j);
i = kfa(i, dep[i] - dep[j]);
if(i == j) return i;
for(int k = __lg(dep[i]); k >= 0; k--){
if(fa[k][i] != fa[k][j]){
i = fa[k][i];
j = fa[k][j];
}
}
return fa[0][i];
}
int a[20][Maxn], b[20][Maxn], lc[Maxn], rc[Maxn], sz[Maxn], stk[Maxn], siz, in[Maxn], in2[Maxn], out[Maxn], out2[Maxn], cnt1, cnt2, ans[Maxn];
int solvea(int l, int r){
int t = __lg(r - l + 1);
return min(a[t][l], a[t][r - (1 << t) + 1]);
}
int solveb(int l, int r){
int t = __lg(r - l + 1);
return max(b[t][l], b[t][r - (1 << t) + 1]);
}
void dfs2(int i){
for(int j = 1; 1 << j <= dep[i]; j++) fa[j][i] = fa[j - 1][fa[j - 1][i]];
in[i] = ++cnt1;
sz[i] = 1;
if(lc[i]){
fa[0][lc[i]] = i;
dep[lc[i]] = dep[i] + 1;
dfs2(lc[i]);
sz[i] += sz[lc[i]];
}
in2[i] = cnt1;
out2[i] = cnt2;
if(rc[i]){
fa[0][rc[i]] = i;
dep[rc[i]] = dep[i] + 1;
dfs2(rc[i]);
sz[i] += sz[rc[i]];
}
out[i] = ++cnt2;
return;
}
struct segtree{
int l[4 * Maxn], r[4 * Maxn], x[4 * Maxn];
void build(int i, int L, int R){
l[i] = L, r[i] = R;
if(L == R) return;
bmid;
build(tlc, L, mid);
build(trc, mid + 1, R);
}
void push_up(int i){
x[i] = max(x[tlc], x[trc]);
}
void upd(int i, int p, int k){
if(l[i] == r[i]){
x[i] = k;
return;
}
bmid;
if(p <= mid) upd(tlc, p, k);
else upd(trc, p, k);
push_up(i);
}
int solve(int i, int L, int R){
if(R < l[i] || r[i] < L) return 0;
if(L <= l[i] && r[i] <= R) return x[i];
return max(solve(tlc, L, R), solve(trc, L, R));
}
} t[2];
struct node{
int l, r, k, tp, id;
bool operator<(const node i)const{
if(k != i.k) return k > i.k;
return id < i.id;
}
} p[3 * Maxn];
int main(){
freopen("query.in", "r", stdin);
freopen("query.out", "w", stdout);
int n = read(), m, q, x, y, l, r, k;
for(int i = 1; i < n; i++){
x = read(), y = read();
g[x].push_back(y);
g[y].push_back(x);
}
if(n == 1){
m = read();
for(int i = 1; i <= m; i++){
read(), read(), read();
puts("1");
}
}
dfs(1);
for(int i = 1; i < n; i++) a[0][i] = dep[lca(i, i + 1)] + 1;
for(int i = 1; i <= n; i++) b[0][i] = dep[i] + 1;
for(int i = 1; 1 << i <= n; i++){
for(int j = 1; j + (1 << i) - 1 <= n; j++){
a[i][j] = min(a[i - 1][j], a[i - 1][j + (1 << (i - 1))]);
b[i][j] = max(b[i - 1][j], b[i - 1][j + (1 << (i - 1))]);
}
}
for(int i = 1; i < n; i++){
while(siz && a[0][i] < a[0][stk[siz]]) lc[i] = stk[siz--];
rc[stk[siz]] = i;
stk[++siz] = i;
}
mes(fa, 0);
dfs2(rc[0]);
for(int i = 1; i <= n; i++) p[i] = {i, 0, sz[i], 0, 0};
q = n;
m = read();
for(int i = 1; i <= m; i++){
l = read(), r = read(), k = read() - 1;
if(!k) ans[i] = solveb(l, r);
else{
ans[i] = max(solvea(l, l + k - 1), solvea(r - k, r - 1));
if(l == 1 && r == n){
p[++q] = {1, n - 1, k, 0, i};
}else if(l == 1){
p[++q] = {1, out2[r], k, 1, i};
}else if(r == n){
p[++q] = {in2[l - 1] + 1, n - 1, k, 0, i};
}else{
x = lca(l - 1, r);
if(x != l - 1) p[++q] = {in2[l - 1] + 1, in2[x], k, 0, i};
if(x != r) p[++q] = {out2[x] + 1, out2[r], k, 1, i};
}
}
}
sort(p + 1, p + q + 1);
t[0].build(1, 1, n - 1), t[1].build(1, 1, n - 1);
for(int i = 1; i <= q; i++){
if(p[i].id) ans[p[i].id] = max(ans[p[i].id], t[p[i].tp].solve(1, p[i].l, p[i].r));
else{
t[0].upd(1, in[p[i].l], a[0][p[i].l]);
t[1].upd(1, out[p[i].l], a[0][p[i].l]);
}
}
for(int i = 1; i <= m; i++) printf("%d\n", ans[i]);
return 0;
}