#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef array<int,2> pr;
typedef array<int,3> tr;
const int N = 5e5+10,INF = 1e9;
template <typename T> void tomin(T& x,T y){x = min(x,y);}
template <typename T> void tomax(T& x,T y){x = max(x,y);}
int n,q,ans[N];
vector<int> e[N];
vector<tr> o1[N];
vector<pr> o2[N];
namespace DS{
int fa[N],R[N];
int arr[N],vis[N],tot;
void init(){
for(int i=1;i<=n;i++)fa[i] = R[i] = i;
}
int find(int x){
if(fa[x] == x)return x;
return fa[x] = find(fa[x]);
}
void merge(int x,int y){
x = find(x),y = find(y); if(x==y)return;
if(x>y)swap(x,y);
fa[y] = x,R[x] = R[y];
}
void set(int x){
arr[++tot] = x; vis[x] = 1;
if(x>1 && vis[x-1])merge(x-1,x);
if(x<n && vis[x+1])merge(x+1,x);
}
pr qry(int x){
x = find(x);
return (pr){x,R[x]};
}
void clear(){
for(int i=1;i<=tot;i++){
int x = arr[i];
fa[x] = R[x] = x; vis[x] = 0;
}
tot = 0;
}
}
const int B = 500;
int I(int x){return (x-1)/B+1;}
int Ld(int x){return (x-1)*B+1;}
int Rd(int x){return min(n,x*B);}
namespace Seg{
int a[N],b[N];
void init(){
for(int i=1;i<=n;i++)a[i] = b[i] = 0;
}
void mdf(int x,int v){
tomax(a[x],v); tomax(b[I(x)],v);
}
int qry(int L,int R){
if(L>R)return 0;
int res = 0;
int il = I(L),ir = I(R);
if(il == ir){
for(int i=L;i<=R;i++)tomax(res,a[i]);
}else{
int lim = Rd(il); for(int i=L;i<=lim;i++)tomax(res,a[i]);
lim = Ld(ir); for(int i=lim;i<=R;i++)tomax(res,a[i]);
for(int i=il+1;i<ir;i++)tomax(res,b[i]);
}
return res;
}
}
int sz[N],son[N],dep[N];
void pdfs(int u,int fa){
sz[u] = 1; dep[u] = dep[fa] + 1;
for(auto v : e[u])if(v != fa){
pdfs(v,u);
sz[u] += sz[v];
if(sz[son[u]] < sz[v])son[u] = v;
}
}
void add_ver(int x,int val){
DS::set(x);
pr it = DS::qry(x);
int L = it[0],R = it[1],len = R-L+1;
o1[len].push_back((tr){L,R,val});
o2[L].push_back((pr){R,val});
}
void rdfs(int u,int fa,int r){
add_ver(u,dep[r]);
for(auto v : e[u])if(v != fa)rdfs(v,u,r);
}
void dfs(int u,int fa){
for(auto v : e[u])if(v != fa && v != son[u]){
dfs(v,u);
DS::clear();
}
if(son[u])dfs(son[u],u);
add_ver(u,dep[u]);
for(auto v : e[u])if(v != fa && v != son[u])rdfs(v,u,u);
}
int main(){
freopen("query.in","r",stdin); freopen("query.out","w",stdout);
ios::sync_with_stdio(false); cin.tie(0);
cin>>n;
for(int i=1,u,v;i<n;i++){
cin>>u>>v;
e[u].push_back(v); e[v].push_back(u);
}
cin>>q;
for(int i=1,l,r,k;i<=q;i++){
cin>>l>>r>>k;
o1[k].push_back((tr){l,r-k+1,-i});
o2[l].push_back((pr){l+k-1,-i});
}
pdfs(1,0);
DS::init();
dfs(1,0);
Seg::init();
for(int k=n;k>=1;k--){
for(auto [l,r,id] : o1[k])if(id > 0){
Seg::mdf(l,id);
}
for(auto [l,r,id] : o1[k])if(id < 0){
int val = Seg::qry(l,r);
tomax(ans[-id],val);
}
}
Seg::init();
for(int L=1;L<=n;L++){
for(auto [R,id] : o2[L])if(id > 0){
Seg::mdf(R,id);
}
for(auto [R,id] : o2[L])if(id < 0){
int val = Seg::qry(R,n);
tomax(ans[-id],val);
}
}
for(int i=1;i<=q;i++)cout<<ans[i]<<"\n";
return 0;
}