本蒟蒻是用trajan做的,样例过了,但WA
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lulu pair<ll,int>
#define ls u/2
#define rs (u/2)+1
#define F(i,j,n) for(int i=(j);i<=(n);i++)
const int N=3e5+10;
const int mod=998244353;
vector <ll> adj[N];
vector <lulu> asked[N];
priority_queue< lulu , vector<lulu> , greater<lulu> > maxpairq;
priority_queue< ll , vector<ll> , greater<ll> > maxq;
priority_queue< lulu ,vector <lulu> > minpairq;
priority_queue< ll ,vector <ll> > minq;
queue <ll> q;
deque <ll> pq;
ll dep[N],sum1,sum2,sum3,n,m,a[N],sum[N],ans[N],k[N];
int vis[N];
struct node{
ll u,v,k;
}scan[N];
ll dp[110][110],fa[N],root;
string s1,s2,s3,s;
char ch[N],chara;
ll powMod(ll a, ll b) {
ll res = 1;
a %= mod;
while (b) {
if (b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
void init(){
F(i,1,N){
fa[i]=i;
}
}
ll find(ll x){
if(fa[x]==x) return x;
else return fa[x]=find(fa[x]);
}
void trajan(ll u){
vis[u]=1;
for(auto v:adj[u]){
if(vis[v]==1) continue;
trajan(v);
fa[v]=u;
}
for(auto q:asked[u]){
ll v=q.first,i=q.second;
if(vis[v]==1){
ans[i]=find(v);
}
}
}
void dfs(ll u,ll f){
dep[u]=dep[f]+1;
for(ll v:adj[u]){
if(v==f) continue;
dfs(v,u);
}
}
int main(){
init();
cin>>n;
for(int i=1;i<=n-1;i++){
ll u,v;
cin>>u>>v;
adj[u].push_back(v);
adj[v].push_back(u);
}
dep[0]=-1;
dfs(1,0);
cin>>m;
for(int i=1;i<=m;i++){
ll u,v;
cin>>u>>v>>scan[i].k;
scan[i].u=u;
scan[i].v=v;
asked[u].push_back({v,i});
asked[v].push_back({u,i});
}
trajan(1);
for(int ti=1;ti<=m;ti++){
ll cnt=0;
ll u=scan[ti].u;
ll v=scan[ti].v;
ll k=scan[ti].k;
for(int i=dep[ans[ti]]+1;i<=dep[u];i++){
cnt=(cnt+powMod(i,k)+2*mod)%mod;
}
for(int j=dep[ans[ti]]+1;j<=dep[v];j++){
cnt=(cnt+powMod(j,k)+2*mod)%mod;
}
cnt=(cnt+dep[ans[ti]]+2*mod)%mod;
cout<<cnt<<endl;
}
return 0;
}