#include <bits/stdc++.h>
using namespace ::std;
const int maxn = 18;
const int mod = 998244353;
inline void jam(int &a, int b) {
  a += b;
  if (a >= mod) a -= mod;
}
inline void kam(int &a, int b) {
  a -= b;
  if (a < 0) a += mod;
}
int ger[maxn];
int dp[1 << maxn];
bool empt[1 << maxn];
int findDag(int n) {
  empt[0] = 1;
  for (int i = 1; i < (1 << n); i++) {
    for (int j = 0; j < n; j++) {
      if ((i >> j) & 1) {
        if (empt[i ^ (1 << j)] && (ger[j] & i) == 0) {
          empt[i] = 1;
        }
        break;
      }
    }
  }
  dp[0] = 1;
  for (int i = 0; i < (1 << n); i++) {
    for (int j = i; j > 0; j = ((j - 1) & i)) {
      if (empt[j]) {
        if (__builtin_popcount(j) & 1) {
          jam(dp[i], dp[i ^ j]);
        } else {
          kam(dp[i], dp[i ^ j]);
        }
      }
    }
  }
  return dp[(1 << n) - 1];
}
long long poww(long long a, long long b) {
  long long ans = 1;
  while (b) {
    if (b & 1) {
      ans = (ans * a) % mod;
    }
    a = (a * a) % mod;
    b >>= 1;
  }
  return ans;
}
int main() {
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    ger[a] ^= (1 << b);
    ger[b] ^= (1 << a);
  }
  long long res = findDag(n);
  cout << (((res * m) % mod) * poww(2, mod - 2)) % mod;
}
