#include<bits/stdc++.h>
#define rep(i, n) for(int i = 0; i < (n); ++i)
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pii;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3fll;
template<typename T> inline void chmin(T &a, const T &b){ (b<a) ? (a=b) : (a); }
template<typename T> inline void chmax(T &a, const T &b){ (b>a) ? (a=b) : (a); }
const int Mod = 1e9 + 7;
inline void uadd(int &a, const int &b){ a += b - Mod; a += (a>>31) & Mod; }
inline void usub(int &a, const int &b){ a -= b; a += (a>>31) & Mod; }
inline void umul(int &a, const int &b){ a = (int)(1ll * a * b % Mod); }
inline int add(int a, const int &b){ a += b - Mod; a += (a>>31) & Mod; return a; }
inline int sub(int a, const int &b){ a -= b; a += (a>>31) & Mod; return a; }
inline int mul(int a, const int &b){ a = (int)(1ll * a * b % Mod); return a; }
int qpow(int b, ll p){ int ret = 1; while(p){ if(p & 1){ umul(ret, b); } umul(b, b), p >>= 1; } return ret; }
const int fN = 100;
int fact[fN], invfact[fN], inv[fN];
void initfact(int n){
fact[0] = 1; for(int i = 1; i <= n; ++i) fact[i] = mul(fact[i - 1], i);
invfact[n] = qpow(fact[n], Mod - 2); for(int i = n; i >= 1; --i) invfact[i - 1] = mul(invfact[i], i);
for(int i = 1; i <= n; ++i) inv[i] = mul(invfact[i], fact[i - 1]);
}
int n;
int eu[500500], ev[500500];
int st[500500], g[1000100], dep[500500];
int q;
int ql[500500], qr[500500], qk[500500], ans[500500];
vector< pair<pii, int> > vs;
vi qks[500500], qrs[500500];
vector<pii> uks[500500], urs[500500];
namespace lca{
int ord[500500], lind[500500], rind[500500], fa[500500], cdfn = 0, qlog[500500], st[22][500500];
void dfs(int u, int par){
ord[cdfn] = u, lind[u] = cdfn++;
for(int i = ::st[u]; i < ::st[u + 1]; ++i){
int t = g[i];
if(t == par) continue;
dep[t] = dep[u] + 1, fa[t] = u;
dfs(t, u);
}
rind[u] = cdfn;
}
int lca(int u, int v){
if(u == v) return u;
u = lind[u], v = lind[v];
if(u > v) swap(u, v);
++u;
int lvl = qlog[v - u];
u = st[lvl][u], v = st[lvl][v - (1<<lvl) + 1];
if(dep[v] < dep[u]) swap(u, v);
u = fa[u];
return u;
}
void init_lca(){
dep[0] = 1;
dfs(0, -1);
for(int i = 2; i <= n; ++i) qlog[i] = qlog[i >> 1] + 1;
rep(i, n) st[0][i] = ord[i];
rep(i, 20) rep(j, n){
st[i + 1][j] = st[i][j];
if(j + (1<<i) < n && dep[st[i][j + (1<<i)]] < dep[st[i][j]]) st[i + 1][j] = st[i][j + (1<<i)];
}
}
}
namespace ds1{
int mx[1111111];
void init(int l, int r, int k){
if(l == r) return mx[k] = dep[l], void();
int mid = (l+r) >> 1;
init(l, mid, k+k), init(mid + 1, r, k+k+1);
mx[k] = max(mx[k+k], mx[k+k+1]);
}
int qry(int tl, int tr, int l, int r, int k){
if(l > tr || tl > r) return -inf;
if(tl <= l && r <= tr) return mx[k];
int mid = (l+r) >> 1;
return max(qry(tl, tr, l, mid, k+k), qry(tl, tr, mid+1, r, k+k+1));
}
}
int a[500500], lb[500500], rb[500500], ch[2][500500], fa[22][500500];
void dfs1(int u){
lb[u] = rb[u] = u;
rep(i, 20) fa[i + 1][u] = (fa[i][u] < 0 ? -1 : fa[i][fa[i][u]]);
if(ch[0][u] >= 0) dfs1(ch[0][u]), lb[u] = lb[ch[0][u]];
if(ch[1][u] >= 0) dfs1(ch[1][u]), rb[u] = rb[ch[1][u]];
vs.push_back(make_pair(make_pair(lb[u], rb[u]), a[u]));
}
void init_a(){
rep(i, n - 1) a[i] = dep[lca::lca(i, i + 1)];
static int stk[500500]; int sp = 0;
memset(ch, -1, sizeof(ch)), memset(fa, -1, sizeof(fa));
rep(i, n - 1){
bool has = 0;
while(sp && a[stk[sp - 1]] > a[i]) --sp, has = 1;
if(has) fa[0][stk[sp]] = i, ch[0][i] = stk[sp];
if(sp) fa[0][i] = stk[sp - 1], ch[1][stk[sp - 1]] = i;
stk[sp++] = i;
}
int rt = stk[0];
dfs1(rt);
}
namespace ds2{
int mx[1111111];
void init(int l, int r, int k){
if(l == r) return mx[k] = -inf, void();
int mid = (l+r) >> 1;
init(l, mid, k+k), init(mid + 1, r, k+k+1);
mx[k] = -inf;
}
void upd(int p, int v, int l, int r, int k){
if(l == r) return chmax(mx[k], v);
int mid = (l+r) >> 1;
(p <= mid) ? upd(p, v, l, mid, k+k) : upd(p, v, mid+1, r, k+k+1);
mx[k] = max(mx[k+k], mx[k+k+1]);
}
int qry(int tl, int tr, int l, int r, int k){
if(l > tr || tl > r) return -inf;
if(tl <= l && r <= tr) return mx[k];
int mid = (l+r) >> 1;
return max(qry(tl, tr, l, mid, k+k), qry(tl, tr, mid+1, r, k+k+1));
}
}
int main(){
freopen("query.in", "r", stdin);
freopen("query.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
rep(i, n - 1){
cin >> eu[i] >> ev[i];
--eu[i], --ev[i];
++st[eu[i]], ++st[ev[i]];
}
rep(i, n) st[i + 1] += st[i];
rep(i, n - 1) g[--st[eu[i]]] = ev[i], g[--st[ev[i]]] = eu[i];
lca::init_lca();
init_a();
ds1::init(0, n-1, 1);
cin >> q;
rep(i, q){
cin >> ql[i] >> qr[i] >> qk[i], --ql[i], --qr[i];
int &l = ql[i], &r = qr[i], &k = qk[i];
if(k == 1){
ans[i] = ds1::qry(l, r, 0, n-1, 1);
} else {
--r, --k;
qks[k].push_back(i);
qrs[l + k - 1].push_back(i);
ans[i] = 0;
}
}
for(auto &p : vs){
int l = p.first.first, r = p.first.second, v = p.second;
uks[r - l + 1].push_back(make_pair(l, v));
urs[r].push_back(make_pair(l, v));
}
ds2::init(0, n - 1, 1);
for(int r = n - 1; r >= 0; --r){
for(auto &p : urs[r]){
ds2::upd(p.first, p.second, 0, n - 1, 1);
}
for(auto &id : qrs[r]){
int l = ql[id];
chmax(ans[id], ds2::qry(0, l - 1, 0, n - 1, 1));
}
}
ds2::init(0, n - 1, 1);
for(int k = n; k >= 0; --k){
for(auto &p : uks[k]){
ds2::upd(p.first, p.second, 0, n - 1, 1);
}
for(auto &id : qks[k]){
int l = ql[id], r = qr[id];
chmax(ans[id], ds2::qry(l, r - k + 1, 0, n - 1, 1));
}
}
rep(i, q) cout << ans[i] << "\n";
return 0;
}