#include<bits/stdc++.h>
using namespace std;
const long long mod=998244353;
struct node {
int next,to;
} edg[1000010];
int n,m,va[1000010][51],mi[1000010],head[1000010],vis[1000010],f[1000010][51],dept[1000010],cnt=0;
void add(int a,int b) {
edg[++cnt].to=b;
edg[cnt].next=head[a];
head[a]=cnt;
}
void dfs(int now) {
for(int i=head[now]; i; i=edg[i].next) {
int v=edg[i].to;
if(vis[v])
continue;
dept[v]=dept[now]+1;
f[v][0]=now;
vis[v]=1;
for(int j=1; j<=50; j++) {
f[v][j]=f[f[v][j-1]][j-1];
}
for(int j=1; j<=50; j++) {
mi[j]=mi[j-1]*dept[v]%mod;
}
for(int j=1; j<=50; j++) {
va[v][j]=(mi[j]+va[now][j])%mod;
}
dfs(v);
}
}
int find(int a,int b) {
if(a==b)
return a;
if(dept[a]<dept[b])
swap(a,b);
for(int i=50; i>=0; i--) {
if(dept[f[a][i]]>=dept[b])
a=f[a][i];
}
if(a==b)
return a;
for(int i=50; i>=0; i--) {
if(f[a][i]!=f[b][i]) {
a=f[a][i];
b=f[b][i];
} else
continue;
}
return f[a][0];
}
int main() {
cin>>n;
for(int i=1,x,y; i<=n-1; i++) {
cin>>x>>y;
add(x,y);
add(y,x);
}
memset(vis,0,sizeof(vis));
dept[1]=1;
vis[1]=1;
mi[0]=1;
dfs(1);
cin>>m;
for(int i=1,x,y,z; i<=m; i++) {
cin>>x>>y>>z;
int l=find(x,y);
cout<<(va[x][z]+va[y][z]-va[l][z]-va[f[l][0]][z])%mod<<endl;
}
return 0;
}