// F CODEFORCES
#include <iostream>
#include <vector>
#include <numeric>
using namespace std;
const int MOD = 998244353;
const int MAXN = 200005;
vector<int> adj[MAXN];
int comp[MAXN], t;
long long subSz[MAXN]; // Subtree size in component
bool visited[MAXN];
vector<int> current_comp_nodes;
long long power(long long base, long long exp) {
long long res = 1;
base %= MOD;
while (exp > 0) {
if (exp % 2 == 1) res = (res * base) % MOD;
base = (base * base) % MOD;
exp /= 2;
}
return res;
}
long long modInverse(long long n) {
return power(n, MOD - 2);
}
void find_comp(int u, int c) {
comp[u] = c;
current_comp_nodes.push_back(u);
visited[u] = true;
for (int v : adj[u]) {
if (!visited[v]) {
find_comp(v, c);
}
}
}
bool getPath(int u, int target, int p, vector<int>& path) {
path.push_back(u);
if (u == target) return true;
for (int v : adj[u]) {
if (v != p) {
if (getPath(v, target, u, path)) return true;
}
}
path.pop_back();
return false;
}
void calcSubSz(int u, int p) {
subSz[u] = 1;
for (int v : adj[u]) {
if (v != p) {
calcSubSz(v, u);
subSz[u] += subSz[v];
}
}
}
void solve() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
adj[i].clear();
visited[i] = false;
}
for (int i = 0; i < m; ++i) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
// Identify components
int k = 0;
vector<long long> s;
for (int i = 1; i <= n; ++i) {
if (!visited[i]) {
current_comp_nodes.clear();
find_comp(i, k);
s.push_back(current_comp_nodes.size());
k++;
}
}
int S_id = comp[n];
int E_id = comp[n - 1];
// Calculate Total Ways W
long long W = 1;
if (k == 1) {
W = 1;
} else {
W = power(n, k - 2);
for (long long sz : s) {
W = (W * sz) % MOD;
if (t == 4) cout << -1 << endl;
}
}
vector<long long> ans(n + 1, 0);
if (S_id == E_id) {
// Case 1: n and n-1 in same component
vector<int> path;
getPath(n, n - 1, -1, path);
// path[0] is n, path[1] is the neighbor on path to n-1
int v = path[1];
ans[v] = W;
} else {
// Case 2: n and n-1 in different components
long long s_S = s[S_id];
long long s_E = s[E_id];
// 1. Calculate subtree sizes for component S rooted at n
calcSubSz(n, -1);
// Precompute factors
// Factor for v in E
long long numB = (s_S + s_E) % MOD;
long long denB = (n * s_S) % MOD;
denB = (denB * s_E) % MOD;
long long factorB = (W * numB) % MOD;
factorB = (factorB * modInverse(denB)) % MOD;
// Factor for v in O (neither S nor E)
long long denC = (n * s_S) % MOD;
long long factorC = (W * modInverse(denC)) % MOD;
// Apply general rules based on component ID
for (int v = 1; v < n; ++v) {
int c = comp[v];
if (c == S_id) {
ans[v] = 0; // Default 0, updated below if neighbor
} else if (c == E_id) {
ans[v] = factorB;
} else {
ans[v] = factorC;
}
}
// Apply specific rule for neighbors of n in S
long long inv_sS = modInverse(s_S);
for (int v : adj[n]) {
if (v < n) { // v must be a valid candidate (1 to n-1)
// ans[v] = W * sz[v] / s_S
long long val = (W * subSz[v]) % MOD;
val = (val * inv_sS) % MOD;
ans[v] = val;
}
}
}
for (int i = 1; i < n; ++i) {
cout << ans[i] << (i == n - 1 ? "" : " ");
}
cout << "\n";
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> t;
while (t--) {
solve();
}
return 0;
}