#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using PII = pair<int, int>;
const int MAXN = 5e5 + 3;
struct Ask{
int l, r, k, ans, id;
}q[MAXN];
struct Node{
int l, r, w;
};
vector<Node> fin;
int n, Q, ans[MAXN], dep[MAXN];
vector<int> eg[MAXN];
set<PII> st[MAXN];
struct SGT{
int tr[MAXN * 4];
void Build(int i, int l, int r){
tr[i] = 0;
if(l == r) return;
int mid = (l + r) >> 1;
Build(i * 2, l, mid), Build(i * 2 + 1, mid + 1, r);
}
void Update(int i, int l, int r, int p, int v){
if(l == r){
tr[i] = max(tr[i], v);
return;
}
int mid = (l + r) >> 1;
if(p <= mid) Update(i * 2, l, mid, p, v);
else Update(i * 2 + 1, mid + 1, r, p, v);
tr[i] = max(tr[i * 2], tr[i * 2 + 1]);
}
int Query(int i, int l, int r, int L, int R){
if(l == L && r == R){
return tr[i];
}
int mid = (l + r) >> 1, ret = 0;
if(L <= mid) ret = max(ret, Query(i * 2, l, mid, L, min(mid, R)));
if(mid + 1 <= R) ret = max(ret, Query(i * 2 + 1, mid + 1, r, max(mid + 1, L), R));
return ret;
}
}tr1, tr2;
void dfs(int x, int dad){
dep[x] = dep[dad] + 1;
st[x].insert({x, x}), fin.push_back({x, x, dep[x]});
for(int nxt : eg[x]){
if(nxt == dad) continue;
dfs(nxt, x);
if(st[nxt].size() > st[x].size()) swap(st[nxt], st[x]);
for(PII e : st[nxt]){
auto it = st[x].lower_bound(e);
PII E = e, er1 = {-1, 0}, er2 = {-1, 0};
if(it != st[x].end() && it->first == e.second + 1){
E.second = it->second, er1 = *it;
}
if(it != st[x].begin() && prev(it)->second == e.first - 1){
E.first = prev(it)->first, er2 = *prev(it);
}
if(er1.first > 0) st[x].erase(er1);
if(er2.first > 0) st[x].erase(er2);
st[x].insert(E), fin.push_back({E.first, E.second, dep[x]});
}
}
}
int main(){
ios::sync_with_stdio(0), cin.tie(0);
freopen("query.in", "r", stdin);
freopen("query.out", "w", stdout);
cin >> n;
for(int i = 1, U, V; i < n; i++){
cin >> U >> V, eg[U].push_back(V), eg[V].push_back(U);
}
dfs(1, 0);
cin >> Q;
for(int i = 1; i <= Q; i++){
cin >> q[i].l >> q[i].r >> q[i].k, q[i].id = i, q[i].ans = 0;
}
sort(fin.begin(), fin.end(), [](Node i, Node j){ return i.r - i.l + 1 > j.r - j.l + 1; });
sort(q + 1, q + 1 + Q, [](Ask i, Ask j){ return i.k > j.k; });
for(int i = 0, j = 1; i < fin.size(); i++){
tr1.Update(1, 1, n, fin[i].r, fin[i].w), tr2.Update(1, 1, n, fin[i].l, fin[i].w);
int nxl = (i == fin.size() - 1 ? 0 : fin[i + 1].r - fin[i + 1].l + 1);
while(j <= Q && q[j].k > nxl){
q[j].ans = max(tr1.Query(1, 1, n, q[j].l + q[j].k - 1, q[j].r), tr2.Query(1, 1, n, q[j].l, q[j].r - q[j].k + 1));
j++;
}
}
tr1.Build(1, 1, n);
sort(fin.begin(), fin.end(), [](Node i, Node j){ return i.l < j.l; });
sort(q + 1, q + 1 + Q, [](Ask i, Ask j){ return i.l < j.l; });
for(int i = 1, j = 0, h = 1; i <= n; i++){
while(j < fin.size() && fin[j].l == i){
tr1.Update(1, 1, n, fin[j].r, fin[j].w);
j++;
}
while(h <= Q && q[h].l == i){
q[h].ans = max(q[h].ans, tr1.Query(1, 1, n, q[h].r, n));
h++;
}
}
sort(q + 1, q + 1 + Q, [](Ask i, Ask j){ return i.id < j.id; });
for(int i = 1; i <= Q; i++){
cout << q[i].ans << "\n";
}
return 0;
}