constint N = 25; constint M = (1 << 20) + 9; constint MOD = 998244353;
int n, m, maxn, maxis, ans; int to[N], map[M], size[M], gs[M], f[M], inv[N]; // to邻点,map见下,size集合大小,gs生成点集 bool is[M];// 是否是独立集
inlinevoidmain(){ read(n), read(m); maxn = 1 << n; for (int i = 1, u, v; i <= m; ++i) read(u), read(v), to[u] |= 1<<(v-1), to[v] |= 1<<(u-1); for (int i = 1; i <= n; ++i) map[1<<(i-1)] = i; is[0] = true; for (int s = 1; s < maxn; ++s) { int x = s & -s, t = s ^ x; x = map[x], gs[s] = size[s] = size[t] + 1; if (is[t] && !(t & to[x])) is[s] = true, maxis = max(maxis, size[s]); for (int i = 1; i <= n; ++i) if (s & to[i]) gs[s]++; } inv[0] = inv[1] = 1; for (int i = 2; i <= n; ++i) inv[i] = 1ll * (MOD - MOD / i) * inv[MOD%i] % MOD; f[0] = 1; for (int s = 1; s < maxn; ++s) if (is[s]) { for (int i = 1, x, t; i < maxn; i <<= 1) if (s & i) { t = s ^ i; f[s] = (1ll * f[t] * inv[n - gs[t]] % MOD + f[s]) % MOD; } if (size[s] == maxis) ans = (ans + f[s]) % MOD; } printf("%d\n", ans); return0; }