#include<bits/stdc++.h>
#define int long long
#define N 300009
#define M 600009
using namespace std;
const int mod=998244353;
int n,m,he[N],cnt,fa[N][32],depth[N],sum[N][59],lg[N];
struct Node{
int ne,to;
}e[M];
void add(int u,int v){
e[++cnt].ne=he[u];
e[cnt].to=v;
he[u]=cnt;
}
int ksm(int a,int b){
if(b==0){
return 1ll;
}
int now=ksm(a,b/2);
if(b%2==1){
return now*now%mod*a%mod;
}
return now*now%mod;
}
inline void init(){
for(int i=1;i<=n;i++){
lg[i]=lg[i-1]+(1<<lg[i-1]==i);
}
}
void dfs(int u,int from){
fa[u][0]=from;
depth[u]=depth[from]+1;
for(int i=1;i<=50;i++){
sum[u][i]=sum[from][i]+ksm(depth[u],i);
sum[u][i]=(sum[u][i]%mod+mod)%mod;
}
for(int i=1;i<=lg[depth[u]];i++){
fa[u][i]=fa[fa[u][i-1]][i-1];
}
for(int i=he[u];i;i=e[i].ne){
int v=e[i].to;
if(v==from){
continue;
}
dfs(v,u);
}
}
int lca(int u,int v){
if(depth[u]<depth[v]){
swap(u,v);
}
while(depth[u]>depth[v]){
u=fa[u][lg[depth[u]-depth[v]]-1];
}
if(u==v){
return u;
}
for(int i=lg[depth[u]];i>=0;i--){
if(fa[u][i]!=fa[v][i]){
u=fa[u][i];
v=fa[v][i];
}
}
return fa[u][0];
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<n;i++){
int x,y;
cin>>x>>y;
add(x,y);
add(y,x);
}
depth[0]=-1;
dfs(1,0);
cin>>m;
for(int i=1;i<=m;i++){
int x,y,z;
cin>>x>>y>>z;
cout<<(sum[x][z]+sum[y][z]-sum[lca(x,y)][z]%mod+mod)%mod<<endl;
}
return 0;
}