#include<bits/stdc++.h>
#define int long long
#define R register
#define F(i,a,b) for(int i = (a);i<=(b);i++)
using namespace std;
inline int read(){R int x=0,t=1;R char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') t=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*t;}
const int N=3e5+10,mod=998244353;
int n,dep[N],fa[N],siz[N],top[N],id[N],w[N],q[N][55],son[N],tot;
vector<int>g[N];
int ksm(int x,int y)
{
int ans=1;
while(y){
if(y&1){
ans*=x;
ans%=mod;
}
x*=x;
x%=mod;
y/=2;
}
return ans;
}
inline void init(int l,int r)
{
F(j,1,50)
F(i,l,r) q[i][j]=(q[i-1][j]+ksm(w[i],j))%mod;
}
inline int query(int k,int l,int r)
{
return (q[r][k]-q[l-1][k])%mod;
}
void dfs1(int u,int Fa)
{
dep[u]=dep[Fa]+1;
fa[u]=Fa;
siz[u]=1;
for(int i = 0;i<g[u].size();i++)
{
int v=g[u][i];
if(v==Fa) continue;
dfs1(v,u);
siz[u]+=siz[v];
if(siz[v]>siz[son[u]]) son[u]=v;
}
return;
}
void dfs2(int u,int topf)
{
id[u]=++tot;
w[tot]=dep[u];
top[u]=topf;
if(!son[u]) return;
dfs2(son[u],topf);
for(int i = 0;i<g[u].size();i++){
int v=g[u][i];
if(id[v]) continue;
dfs2(v,v);
}
return;
}
inline int qRange(int u,int v,int k)
{
int ans=0;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
ans+=query(k,id[top[u]],id[u]);
ans%=mod;
u=fa[top[u]];
}
if(dep[u]>dep[v]) swap(u,v);
ans+=query(k,id[u],id[v]);
ans%=mod;
return ans;
}
signed main()
{
n=read();
F(i,2,n){
int ui=read(),vi=read();
g[ui].push_back(vi);
g[vi].push_back(ui);
}
dep[0]=-1;
dfs1(1,0);
dfs2(1,1);
init(1,n);
int m=read();
F(i,1,m){
int ui=read(),vi=read(),k=read();
cout << qRange(ui,vi,k)%mod << '\n';
}
return 0;
}