#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 3e5 + 10, M = N * 2, K = 51, MOD = 998244353;
int n, m;
int s[N][K];
int h[N], e[M], ne[M], idx;
int dep[N], fa[N], sz[N];
int son[N], top[N];
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
int ksm(int a, int b)
{
int res = 1;
while (b)
{
if (b & 1) res = (1ll * res * a) % MOD;
a = (1ll * a * a) % MOD;
b >>= 1;
}
return res;
}
void dfs1(int u, int father)
{
for (int k = 1; k <= 50; k ++ )
s[u][k] = (s[father][k] + ksm(dep[u], k)) % MOD;
sz[u] = 1;
for (int i = h[u]; ~i; i = ne[i])
{
int j = e[i];
if (j == father) continue;
dep[j] = dep[u] + 1, fa[j] = u;
dfs1(j, u);
if (sz[son[u]] < sz[j]) son[u] = j;
sz[u] += sz[j];
}
}
void dfs2(int u, int tp)
{
top[u] = tp;
if (!son[u]) return ;
dfs2(son[u], tp);
for (int i = h[u]; ~i; i = ne[i])
{
int j = e[i];
if (j == fa[u] || j == son[u]) continue;
dfs2(j, j);
}
}
int lca(int u, int v)
{
while (top[u] != top[v])
{
if (dep[top[u]] < dep[top[v]]) swap(u, v);
u = fa[top[u]];
}
if (dep[u] < dep[v]) swap(u, v);
return v;
}
int main()
{
scanf("%d", &n);
memset(h, -1, sizeof h);
for (int i = 0; i < n - 1; i ++ )
{
int a, b;
scanf("%d%d", &a, &b);
add(a, b), add(b, a);
}
dfs1(1, 0), dfs2(1, 1);
scanf("%d", &m);
while (m -- )
{
int u, v, k;
scanf("%d%d%d", &u, &v, &k);
int p = lca(u, v);
printf("%d\n", ((s[u][k] + s[v][k] - s[p][k] - s[fa[p]][k]) % MOD + MOD) % MOD);
}
return 0;
}