#include <bits/stdc++.h>
#define reg register
#pragma target("avx")
#pragma optimize(1)
#pragma optimize(2)
#pragma optimize(3)
#pragma optimize("Ofast")
#pragma optimize("inline")
#pragma optimize("-fgcse")
#pragma optimize("-fgcse-lm")
#pragma optimize("-fipa-sra")
#pragma optimize("-ftree-pre")
#pragma optimize("-ftree-vrp")
#pragma optimize("-fpeephole2")
#pragma optimize("-ffast-math")
#pragma optimize("-fsched-spec")
#pragma optimize("unroll-loops")
#pragma optimize("-falign-jumps")
#pragma optimize("-falign-loops")
#pragma optimize("-falign-labels")
#pragma optimize("-fdevirtualize")
#pragma optimize("-fcaller-saves")
#pragma optimize("-fcrossjumping")
#pragma optimize("-fthread-jumps")
#pragma optimize("-funroll-loops")
#pragma optimize("-fwhole-program")
#pragma optimize("-freorder-blocks")
#pragma optimize("-fschedule-insns")
#pragma optimize("inline-functions")
#pragma optimize("-ftree-tail-merge")
#pragma optimize("-fschedule-insns2")
#pragma optimize("-fstrict-aliasing")
#pragma optimize("-fstrict-overflow")
#pragma optimize("-falign-functions")
#pragma optimize("-fcse-skip-blocks")
#pragma optimize("-fcse-follow-jumps")
#pragma optimize("-fsched-interblock")
#pragma optimize("-fpartial-inlining")
#pragma optimize("no-stack-protector")
#pragma optimize("-freorder-functions")
#pragma optimize("-findirect-inlining")
#pragma optimize("-fhoist-adjacent-loads")
#pragma optimize("-frerun-cse-after-loop")
#pragma optimize("inline-small-functions")
#pragma optimize("-finline-small-functions")
#pragma optimize("-ftree-switch-conversion")
#pragma optimize("-foptimize-sibling-calls")
#pragma optimize("-fexpensive-optimizations")
#pragma optimize("-funsafe-loop-optimizations")
#pragma optimize("inline-functions-called-once")
#pragma optimize("-fdelete-null-pointer-checks")
#define int long long
using namespace std;
const int N=300010;
const int mod=998244353;
int head[N],fa[N][60],dep[N],nxt[N*2],to[N*2];
int n,m,tot,res,ans,vis[N],yu[N][60];
inline int ksm(int a,int b){
int c=1;
for(;b;b>>=1){
if(b&1)c=c*a%mod;
a=a*a%mod;
}
return c;
}
inline int add(int x,int y){
nxt[++tot]=head[x];
head[x]=tot;
to[tot]=y;
}
inline void dfs(int x,int faa){
dep[x]=dep[faa]+1;
fa[x][0]=faa;
for(reg int i=1;i<50;i++)yu[x][i]=(yu[faa][i]+ksm(dep[x],i)+mod)%mod;
for(reg int i=head[x];i;i=nxt[i]){
int y=to[i];
if(y==faa)continue;
dfs(y,x);
}
}
inline int lca(int x,int y){
if(dep[x]>dep[y])swap(x,y);
for(int i=20;i>=0;i--)if(dep[x]<=dep[y]-(1<<i))y=fa[y][i];
if(x==y)return x;
for(reg int i=20;i>=0;i--){
if(fa[x][i]!=fa[y][i]){
x=fa[x][i],y=fa[y][i];
}
}
return fa[x][0];
}
inline int read(){
int s=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
s=(s*10+c-'0');
c=getchar();
}
return s*f;
}
signed main(){
n=read();
for(reg int i=1;i<n;i++){
int x=read(),y=read();
add(x,y);
add(y,x);
}
dep[1]=-1;
dfs(1,1);
for(reg int j=1;j<=21;j++) for(reg int i=1;i<=n;i++)fa[i][j]=fa[fa[i][j-1]][j-1];
int q=read();
while(q--){
int x=read(),y=read(),z=read();
int xy=lca(x,y);
int s1=(yu[x][z]+yu[y][z]+mod)%mod;
int s2=(yu[xy][z]+yu[fa[xy][0]][z]+mod)%mod;
printf("%lld\n",((s1-s2)+mod)%mod);
}
return 0;
}