#include <bits/stdc++.h>
using namespace std;
const int len = 153 + 4, mod = 998244353;
pair<int, int> edge[len];
int n, m, adj[len], nod[(1 << 18) + 5];
map<int, int> mym[(1 << 18) + 5];
vector<int> vec[(1 << 18) + 5];
int add(int a, int b) { return (a + b >= mod) ? (a + b - mod) : (a + b); }
int mul(int a, int b) { return (a * 1LL * b) % mod; }
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 0; i < m; i++) {
    int a, b;
    scanf("%d %d", &a, &b);
    a--, b--;
    edge[i] = make_pair(a, b);
    adj[a] |= (1 << b);
    adj[b] |= (1 << a);
  }
  for (int j = 0; j < n; j++) nod[(1 << j)] = j;
  mym[0][(1 << n) - 1] = 1;
  for (int use = 0; use < (1 << n) - 1; use++) {
    for (auto it : mym[use]) {
      int can = it.first, cnt = it.second;
      for (int j = 0; j < n; j++) {
        if ((can & (1 << j)) == 0) continue;
        int nex = can & ((1 << n) - (1 << (j + 1)));
        nex |= adj[j] & (((1 << n) - 1) ^ use);
        mym[use | (1 << j)][nex] = add(mym[use | (1 << j)][nex], cnt);
      }
    }
  }
  int ans = mym[(1 << n) - 1][0];
  ans = mul(ans, (mod + 1) / 2);
  ans = mul(ans, m);
  printf("%d\n", ans);
  return 0;
}
