#include <bits/stdc++.h>
#define int long long
#define frr(a) freopen(a, "r", stdin)
#define fww(a) freopen(a, "w", stdout)
#define eb emplace_back
using namespace std;
using ll = long long;
struct fio {
char gc() {return getchar();}
template <typename T> void read(T& x) {
cin >> x; return;
char c = gc(), l = 0; x = 0;
while (!isdigit(c)) l = c, c = gc();
while ( isdigit(c)) x = (x << 1) + (x << 3) + c - 48, c = gc();
if (l == '-') x = -x;
}
template <typename T, typename ...A> void read(T& x, A&... a) {
read(x), read(a...);
}
} IO;
const int N = 2e5 + 10, mod = 998244353;
ll qpow(ll a, ll n = mod - 2) {
ll res = 1;
while (n) {
if (n & 1) res = res * a % mod;
a = a * a % mod, n >>= 1;
} return res;
}
struct ED {
ll v, nxt;
ED(int a = 0, int b = 0) {
v = a, nxt = b;
}
} edge[2 * N]; ll head[N], tote;
void adde(ll u, ll v) {
edge[++tote] = ED(v, head[u]);
head[u] = tote;
}
ll n;
ll d[N], sz[N], v[N], sumv[N], vd[N], sumvd[N], vd2[N], sumvd2[N];
void clr() {
for (int i = 0; i <= n; i++) {
d[i] = sz[i] = v[i] = sumv[i] = vd[i] = sumvd[i] = vd2[i] = sumvd2[i] = head[i] = 0;
}
for (int i = 1; i <= tote; i++) edge[i] = ED();
tote = 0;
}
void dfs1(int x = 1, int fat = 0) {
d[x] = d[fat] + 1; sz[x] = 1;
ll S = 0;
for (int i = head[x]; i; i = edge[i].nxt) {
int y = edge[i].v; if (y == fat) continue;
dfs1(y, x); (sz[x] += sz[y]) %= mod;
(v[x] += sz[y] * S % mod) %= mod; (S += sz[y]) %= mod;
(sumv[x] += sumv[y]) %= mod;
(sumvd[x] += sumvd[y]) %= mod;
(sumvd2[x] += sumvd2[y]) %= mod;
}
v[x] = (v[x] * 2ll % mod + 2ll * sz[x] % mod - 1) % mod, (sumv[x] += v[x]) %= mod;
vd[x] = v[x] * d[x] % mod, (sumvd[x] += vd[x]) %= mod;
vd2[x] = v[x] * d[x] % mod * d[x] % mod, (sumvd2[x] += vd2[x]) %= mod;
}
ll res = 0;
void dfs2(int x = 1, int fat = 0, ll delv = 0, ll delvd = 0) { // 分岔路径的贡献
ll val1 = v[x] * d[x] % mod * d[x] % mod * (sumv[1] - delv - sumv[x]) % mod; // vx * vy * dx^2
(res += val1) %= mod;
ll val2 = 0, sum2 = 0; // vx * vy * dlca ^ 2
ll val3 = vd[x] * (sumvd[1] - delvd - sumvd[x]) % mod; // 2 * vx * vy * dx * dy
(res += val3) %= mod;
ll val4 = 0, sum4 = 0; // -4 * vx * vy * dx * dlca
for (int i = head[x]; i; i = edge[i].nxt) {
int y = edge[i].v; if (y == fat) continue;
dfs2(y, x, delv + v[x], delvd + vd[x]);
(val2 += sum2 * sumv[y] % mod) %= mod;
(val4 += sum2 * sumvd[y] % mod + sum4 * sumv[y] % mod) %= mod, (sum4 += sumvd[y]) %= mod;
(sum2 += sumv[y]) %= mod;
}
(res += 4ll * val2 % mod * d[x] % mod * d[x] % mod) %= mod;
(res += -4ll * val4 % mod * d[x] % mod) %= mod;
// printf("x:%d val1:%lld val2:%lld(%lld) val3:%lld val4:%lld\n", x, val1, val2, 8ll * val2 % mod * d[x] % mod * d[x] % mod, val3, val4);
}
void dfs3(int x = 1, int fat = 0) {
ll pres = n - sz[x], prev = 0;
for (int i = head[x]; i; i = edge[i].nxt) {
int y = edge[i].v; if (y == fat) continue;
dfs3(y, x);
(prev += pres * sz[y] % mod) %= mod, (pres += sz[y]) %= mod;
} prev = (prev * 2ll) % mod;
// printf("before x:%d res:%lld\n", x, res);
for (int i = head[x]; i; i = edge[i].nxt) {
int y = edge[i].v; if (y == fat) continue;
ll T = prev;
(T -= sz[y] * (n - sz[y] - 1) % mod * 2ll % mod) %= mod;
(T += 2ll * (n - sz[y]) % mod - 1) %= mod; // 我们必须相信 T 算的是对的
T %= mod;
// printf("x:%d y:%d T:%lld\n", x, y, T);
ll val1 = T * d[x] % mod * d[x] % mod * sumv[y] % mod;
(res += val1) %= mod;
ll val2 = T * sumvd2[y] % mod;
(res += val2) %= mod;
ll val3 = 2ll * T % mod * d[x] % mod * sumvd[y] % mod;
(res -= val3) %= mod;
}
}
void solve() {
res = 0;
IO.read(n);
for (int i = 1; i < n; i++) {
int u, v; IO.read(u, v);
adde(u, v), adde(v, u);
}
dfs1();
// for (int i = 1; i <= n; i++) {
// printf("i:%d v:%lld\n", i, v[i]);
// }
// printf("res1:%lld\n", res);
dfs2(); // 分岔路径的贡献
// printf("res2:%lld\n", res);
dfs3();
// printf("res3:%lld\n", res);
ll mu = (1ll * n * (n - 1) / 2ll) % mod; mu = qpow(mu * mu % mod);
res = res * mu % mod;
printf("%lld\n", (res + mod) % mod);
clr();
}
signed main() {
// frr("1.in");
// fww("1.out");
int Ts; IO.read(Ts);
while (Ts--) solve();
return 0;
}
/*
1
3
1 2
2 3
5
1 2
1 5
3 2
4 2
*/