#include <bits/stdc++.h>
using namespace std;
const int N = 20, P = (1 << N);
const long long MOD = 998244353;
vector<int> g[N], hg[N];
int ans[P], qan[P], kox[P][N], ppc[P], tv[P];
int vrj[P];
bool bad2[P], bad[P];
int col[N];
void gum(int &a, int b) {
  a += b;
  if (a >= MOD) a -= MOD;
}
void han(int &a, int b) {
  a -= b;
  if (a < 0) a += MOD;
}
int tvans;
void dfs(int v, int cl) {
  col[v] = cl;
  tvans += (1 << v);
  for (auto to : g[v]) {
    if (!col[to]) dfs(to, cl);
  }
  for (auto to : hg[v]) {
    if (!col[to]) dfs(to, cl);
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  ;
  mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < (m); ++i) {
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    g[a].push_back(b);
    hg[b].push_back(a);
  }
  int cnt = 1;
  vector<int> comps;
  for (int i = 0; i < (n); ++i) {
    if (!col[i]) {
      tvans = 0;
      dfs(i, cnt++);
      if (tvans) comps.push_back(tvans);
    }
  }
  for (int msk = 0; msk < ((1 << n)); ++msk) {
    vrj[msk] = -1;
    for (int i = 0; i < (n); ++i) {
      if ((1 << i) & msk) {
        if (vrj[msk] != -1 && col[vrj[msk]] != col[i]) {
          bad2[msk] = true;
        }
        ppc[msk]++;
        for (auto to : g[i]) {
          if ((1 << to) & msk) {
            bad[msk] = true;
            kox[msk ^ (1 << i)][i]++;
          }
        }
        vrj[msk] = i;
      }
    }
  }
  int lr = (1 << n) - 1;
  qan[0] = 1;
  for (int msk = (0); msk <= ((1 << n) - 2); ++msk) {
    if (bad2[msk]) continue;
    int nmsk = lr ^ msk;
    tv[0] = 0;
    int s = nmsk;
    do {
      s = (s - 1) & nmsk;
      s = nmsk ^ s;
      if (bad[s]) {
        tv[s] = 0;
        s = nmsk ^ s;
        continue;
      }
      tv[s] = tv[s ^ (1 << vrj[s])] + kox[msk][vrj[s]];
      if (ppc[s] & 1) {
        gum(qan[msk + s], qan[msk]);
        gum(ans[msk + s], (1ll * tv[s] * qan[msk] + 1ll * ans[msk]) % MOD);
      } else {
        han(qan[msk + s], qan[msk]);
        han(ans[msk + s], (1ll * tv[s] * qan[msk] + 1ll * ans[msk]) % MOD);
      }
      s = nmsk ^ s;
    } while (s);
  }
  if (bad2[lr]) {
    qan[lr] = 1;
    ans[lr] = 0;
    for (auto msk : comps) {
      ans[lr] = (1ll * qan[lr] * ans[msk] + 1ll * qan[msk] * ans[lr]) % MOD;
      qan[lr] = (1ll * qan[lr] * qan[msk]) % MOD;
    }
  }
  cout << ans[lr] << endl;
  return 0;
}
