#include <bits/stdc++.h>
using namespace std;
bool MM1;
template <class T>
bool tomax(T &x, T y) {
  if (x < y) return x = y, 1;
  return 0;
}
template <class T>
bool tomin(T &x, T y) {
  if (x > y) return x = y, 1;
  return 0;
}
const int P = 998244353;
const int Inv2 = 499122177;
void calc(int &x, int y) {
  x += y;
  if (x >= P) x -= P;
}
void Mul(int &x, int y) { x = 1LL * x * y % P; }
int n, m;
struct P0 {
  struct Node {
    int a, b;
  } G[25];
  vector<int> E[25];
  int in[25], Q[25];
  int check() {
    int L = 1, R = 0;
    for (int i = 1; i <= n; i++)
      if (!in[i]) Q[++R] = i;
    while (L <= R) {
      int now = Q[L++];
      for (int i = 0; i < E[now].size(); i++) {
        int to = E[now][i];
        in[to]--;
        if (!in[to]) Q[++R] = to;
      }
    }
    return R == n;
  }
  void solve() {
    for (int i = 1; i <= m; i++) scanf("%d%d", &G[i].a, &G[i].b);
    int ans = 0;
    for (int i = 0; i < 1 << m; i++) {
      memset(in, 0, sizeof(in));
      for (int j = 1; j <= n; j++) E[j].clear();
      int res = 0;
      for (int j = 1; j <= m; j++)
        if ((1 << j - 1) & i)
          E[G[j].a].push_back(G[j].b), res++, in[G[j].b]++;
        else
          E[G[j].b].push_back(G[j].a), in[G[j].a]++;
      calc(ans, res * check());
    }
    cout << ans;
  }
} p0;
int hv[25];
struct P1 {
  int dp[1 << 18], mark[1 << 18], cnt[1 << 18];
  void solve() {
    for (int i = 0; i < 1 << n; i++) {
      bool fl = 1;
      for (int j = 0; fl && j < n; j++)
        if ((1 << j) & i)
          if (hv[j] & i) fl = 0;
      mark[i] = fl;
      if (i) cnt[i] = cnt[i ^ (i & -i)] + 1;
    }
    dp[0] = 1;
    for (int i = 1; i < 1 << n; i++)
      for (int j = i; j; j = (j - 1) & i) {
        if (!mark[j]) continue;
        if (cnt[j] & 1)
          calc(dp[i], dp[j ^ i]);
        else
          calc(dp[i], P - dp[j ^ i]);
      }
    int ans = 1LL * dp[(1 << n) - 1] * m % P * Inv2 % P;
    printf("%d\n", ans);
  }
} p1;
bool MM2;
int main() {
  scanf("%d%d", &n, &m);
  for (int a, b, i = 1; i <= m; i++) {
    scanf("%d%d", &a, &b);
    a--, b--;
    hv[a] |= 1 << b, hv[b] |= 1 << a;
  }
  p1.solve();
  return 0;
}
