#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MOD = 998244353;
const int G = 3;
int modpow(ll a, ll e) {
ll r = 1 % MOD;
while (e) {
if (e & 1) r = r * a % MOD;
a = a * a % MOD;
e >>= 1;
}
return (int)r;
}
void ntt(vector<int>& a, bool invert) {
int n = a.size();
for (int i = 1, j = 0; i < n; ++i) {
int bit = n >> 1;
for (; j & bit; bit >>= 1) j ^= bit;
j ^= bit;
if (i < j) swap(a[i], a[j]);
}
for (int len = 2; len <= n; len <<= 1) {
int wlen = modpow(G, (MOD - 1) / len);
if (invert) wlen = modpow(wlen, MOD - 2);
for (int i = 0; i < n; i += len) {
ll w = 1;
for (int j = 0; j < len/2; ++j) {
int u = a[i + j];
int v = (int)(a[i + j + len/2] * w % MOD);
a[i + j] = u + v < MOD ? u + v : u + v - MOD;
a[i + j + len/2] = u - v >= 0 ? u - v : u - v + MOD;
w = w * wlen % MOD;
}
}
}
if (invert) {
int inv_n = modpow(n, MOD - 2);
for (int &x : a) x = (int)(1LL * x * inv_n % MOD);
}
}
vector<int> conv(vector<int> a, vector<int> b) {
if (a.empty() || b.empty()) return {};
int n = 1;
while (n < (int)a.size() + (int)b.size() - 1) n <<= 1;
a.resize(n); b.resize(n);
ntt(a, false); ntt(b, false);
for (int i = 0; i < n; ++i) a[i] = (int)(1LL * a[i] * b[i] % MOD);
ntt(a, true);
a.resize((int)a.size() + (int)b.size() - 1);
return a;
}
struct Poly4 {
vector<int> A, B, C, D;
};
Poly4 merge_poly(const Poly4& L, const Poly4& R) {
Poly4 res;
res.A = conv(L.A, R.A);
res.B = conv(L.A, R.B);
auto tmp = conv(L.B, R.A);
if (res.B.size() < tmp.size()) res.B.resize(tmp.size(), 0);
for (int i = 0; i < (int)tmp.size(); ++i) {
res.B[i] += tmp[i];
if (res.B[i] >= MOD) res.B[i] -= MOD;
}
res.C = conv(L.A, R.C);
tmp = conv(L.C, R.A);
if (res.C.size() < tmp.size()) res.C.resize(tmp.size(), 0);
for (int i = 0; i < (int)tmp.size(); ++i) {
res.C[i] += tmp[i];
if (res.C[i] >= MOD) res.C[i] -= MOD;
}
res.D = conv(L.A, R.D);
tmp = conv(L.D, R.A);
if (res.D.size() < tmp.size()) res.D.resize(tmp.size(), 0);
for (int i = 0; i < (int)tmp.size(); ++i) {
res.D[i] += tmp[i];
if (res.D[i] >= MOD) res.D[i] -= MOD;
}
tmp = conv(L.B, R.C);
if (res.D.size() < tmp.size()) res.D.resize(tmp.size(), 0);
for (int i = 0; i < (int)tmp.size(); ++i) {
res.D[i] += tmp[i];
if (res.D[i] >= MOD) res.D[i] -= MOD;
}
tmp = conv(L.C, R.B);
if (res.D.size() < tmp.size()) res.D.resize(tmp.size(), 0);
for (int i = 0; i < (int)tmp.size(); ++i) {
res.D[i] += tmp[i];
if (res.D[i] >= MOD) res.D[i] -= MOD;
}
return res;
}
Poly4 build_poly(const vector<int>& w, int l, int r) {
if (l == r) {
Poly4 p;
int x = w[l];
int x2 = (int)(1LL * x * x % MOD);
p.A = {1, x};
p.B = {0, 1};
p.C = {0, x2};
p.D = {0, x};
return p;
}
int mid = (l + r) >> 1;
Poly4 L = build_poly(w, l, mid);
Poly4 R = build_poly(w, mid + 1, r);
return merge_poly(L, R);
}
struct DSU {
vector<int> p, sz;
DSU(int n=0){init(n);}
void init(int n){p.resize(n);sz.assign(n,1);iota(p.begin(),p.end(),0);}
int find(int x){return p[x]==x?x:p[x]=find(p[x]);}
void unite(int a,int b){
a=find(a);b=find(b);
if(a==b) return;
if(sz[a]<sz[b]) swap(a,b);
p[b]=a; sz[a]+=sz[b];
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
// factorial
const int MAXN = 200000;
vector<int> fact(MAXN+5);
fact[0]=1;
for (int i=1;i<=MAXN;i++) fact[i]=(ll)fact[i-1]*i%MOD;
while (T--) {
int n;
cin >> n;
vector<vector<int>> g(n+1);
for (int i=0;i<n-1;i++){
int u,v;cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
vector<int> parent(n+1,-1), order;
order.reserve(n);
order.push_back(1);
for(int i=0;i<(int)order.size();++i){
int u=order[i];
for(int v:g[u]) if(v!=parent[u]){
parent[v]=u;
order.push_back(v);
}
}
vector<int> sz(n+1,0);
for (int i=n-1;i>=0;--i){
int u=order[i];
int s=1;
for(int v:g[u]) if(v!=parent[u]) s+=sz[v];
sz[u]=s;
}
DSU dsu(n+1);
for(int v=2;v<=n;v++){
if(sz[v]%2==1){
dsu.unite(v,parent[v]);
}
}
// map components
unordered_map<int,int> id;
vector<int> comp_id(n+1);
int k=0;
vector<int> comp_size;
for(int i=1;i<=n;i++){
int r=dsu.find(i);
if(!id.count(r)){
id[r]=k++;
comp_size.push_back(0);
}
comp_id[i]=id[r];
comp_size[comp_id[i]]++;
}
int rootComp = comp_id[1];
int kcomp = k;
vector<int> w(kcomp);
for(int i=0;i<kcomp;i++) w[i]=comp_size[i];
int wr = w[rootComp];
bool rootOdd = (wr%2==1);
vector<int> E, O;
for(int i=0;i<kcomp;i++){
if(w[i]%2==0) E.push_back(i);
else O.push_back(i);
}
vector<int> Oprime;
for(int v:O){
if(rootOdd && v==rootComp) continue;
Oprime.push_back(v);
}
int o = Oprime.size();
ll P_O = 1;
ll sumInv_O = 0;
vector<int> w_odd;
w_odd.reserve(o);
for(int v:Oprime){
int wi=w[v];
w_odd.push_back(wi);
P_O = P_O * wi % MOD;
sumInv_O = (sumInv_O + modpow(wi, MOD-2)) % MOD;
}
ll sumE = 0, invSumE = 0, P_E2 = 1;
for(int v:E){
if(v==rootComp && !rootOdd) continue;
int wi=w[v];
sumE = (sumE + wi) % MOD;
invSumE = (invSumE + modpow(wi, MOD-2)) % MOD;
P_E2 = P_E2 * wi % MOD * wi % MOD;
}
if (!rootOdd) sumE = (sumE + wr) % MOD;
ll baseSum = sumE;
if (rootOdd) baseSum = (baseSum + wr) % MOD;
int Ecount = E.size();
if (rootOdd) Ecount = E.size();
else Ecount = E.size();
ll N = n % MOD;
vector<int> powN(o+1);
powN[0]=1;
for(int i=1;i<=o;i++) powN[i]=(ll)powN[i-1]*N%MOD;
vector<int> A(o+1,0),B(o+1,0),C(o+1,0),D(o+1,0);
if(o==0){
A[0]=1; B[0]=C[0]=D[0]=0;
} else {
Poly4 poly = build_poly(w_odd,0,o-1);
A = poly.A; B = poly.B; C = poly.C; D = poly.D;
}
ll constPart = (ll)wr * P_E2 % MOD * P_O % MOD;
ll ans = 0;
if (o>=0) {
if ((E.size()==0 && rootOdd) || (E.size()==1 && !rootOdd)) {
if (o==0) {
ans = (ans + 1) % MOD;
} else {
ans = (ans + P_O * powN[o-1] % MOD * wr) % MOD;
}
}
}
for (int t=0; t<=o; ++t) {
int L = E.size() + t + (rootOdd ? 1 : 0);
if (L < 2) continue;
int U = o - t;
if (U==0) {
ll prodW = P_O;
ll sumInvS = sumInv_O;
ll term = (invSumE + sumInvS) % MOD;
ll add = (ll)fact[L-2] * wr % MOD * P_E2 % MOD;
add = add * prodW % MOD * prodW % MOD * term % MOD;
ans = (ans + add) % MOD;
} else {
ll term = 0;
term = (term + invSumE * baseSum % MOD * A[t]) % MOD;
term = (term + invSumE * C[t]) % MOD;
term = (term + baseSum * B[t]) % MOD;
term = (term + D[t]) % MOD;
ll add = constPart;
add = add * fact[L-2] % MOD;
add = add * powN[U-1] % MOD;
add = add * term % MOD;
ans = (ans + add) % MOD;
}
}
cout << ans % MOD << "\n";
}
return 0;
}