#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
#define int long long
#define re register
#define For(i,l,r) for(re int i=l;i<=r;i++)
#define Rep(i,l,r) for(re int i=l;i>=r;i--)
#define ls(c) c<<1
#define rs(c) c<<1|1
const int N=3e5+5;
const int p=998244353;
inline void fast(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
}
inline void read(int &x){
x=0;int f=1;
char c=getchar();
while(!isdigit(c)){
if(c=='-') f=-1;
c=getchar();
}while(isdigit(c)){
x=x*10+c-'0';
c=getchar();
}x*=f;
}
inline void write(int x){
if(x<0){x=-x;putchar('-');}
if(x>9) write(x/10);
putchar(x%10+'0');
}
int n,m;
int u,v,k;
vector<int> edge[N<<2];
int dep[N],size[N],fa[N],sum[N][51];
int son[N],id[N],top[N],cnt;
int power(int x,int y){
int res=1;
while(y){
if(y&1) res*=x%p;
x*=x%p;
y>>=1;
}return res%p;
}
inline void dfs1(int u,int faz){
fa[u]=faz;
size[u]=1;
dep[u]=dep[faz]+1;
for(int i=0;i<=50;i++){
sum[u][i]=(sum[faz][i]%p+(int)(pow(dep[u]-1,i))%p)%p;
}
for(int j=0;j<edge[u].size();j++){
int v=edge[u][j];
if(v==faz) continue;
dfs1(v,u);
size[u]+=size[v];
if(size[son[u]]<size[v]) son[u]=v;
}
}inline void dfs2(int u,int head){
top[u]=head;
id[u]=++cnt;
if(son[u]) dfs2(son[u],head);
for(int j=0;j<edge[u].size();j++){
int v=edge[u][j];
if(v==fa[u]||v==son[u]) continue;
dfs2(v,v);
}
}int lca(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
x=fa[top[x]];
}if(dep[x]<dep[y]) return x;
return y;
}
signed main(){
fast();
cin>>n;
For(i,1,n-1){
cin>>u>>v;
edge[u].push_back(v);
edge[v].push_back(u);
}
dfs1(1,0);
dfs2(1,1);
cin>>m;
while(m--){
cin>>u>>v>>k;
int lca_=lca(u,v);
int ans = ((sum[u][k] + sum[v][k]) % p - (sum[lca_][k] + sum[fa[lca_]][k]) % p + p) % p;
cout<<ans<<'\n';
}
return 0;
}