#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
#define int long long
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
const int N = 3e6 + 50;
const int mod = 998244353;
struct Edge{
int to,next;
}edge[N];
int head[N],cnt;
void init() {
for (int i = 1;i <= N ;i++) {
edge[i].next = -1;head[i] = -1;
}
cnt = 0;
}
void add(int u,int v) {
edge[cnt].to = v;
edge[cnt].next = head[u];
head[u] = cnt++;
}
int deep[N],fa[N][20];
int sum[N][55];
int fast_mi(int a,int b) {
int ans = 1;
while (b) {
if (b%2) {ans = (ans*a) % mod;}
b >>= 1;a = (a*a) % mod;}
return ans;
}
void dfs(int x,int father) {
deep[x] = deep[father] + 1;
fa[x][0] = father;
for (int i = 1;(1<<i) <= deep[x]; i++) {
fa[x][i] = fa[fa[x][i-1]][i-1];
}
for (int j = 1;j <= 50; j++) sum[x][j] = (sum[father][j] + fast_mi(deep[father],j));
for (int i = head[x];~i;i = edge[i].next) {
int v = edge[i].to;
if (v == father) continue;
dfs(v,x);
}
}
int LCA(int a,int b) {
if (deep[a] < deep[b]) swap(a,b);
for (int i = log2(N);i >= 0; i--) {
if (deep[a] - (1<<i) >= deep[b]) {
a = fa[a][i];
}
if (a == b) return a;
}
for (int i = log2(N);i >= 0; i--) {
if (fa[a][i] != fa[b][i]) {
a = fa[a][i];b = fa[b][i];
}
}
return fa[a][0];
}
signed main() {
ios;
init();
int n,m;
cin >> n;
for (int i = 1;i < n; i++) {
int u,v;
cin >> u >> v;
add(u,v);add(v,u);
}
dfs(1,0);
cin >> m;
for (int i = 1;i <= m; i++) {
int a,b,k;
cin >> a >> b >> k;
int l = LCA(a,b);
int ans = (sum[a][k] + sum[b][k] - sum[l][k] - sum[fa[l][0]][k] + 2 * mod) % mod;
cout << ans << endl;
}
return 0;
}