#include <bits/stdc++.h>
using namespace std;
#define ar array
#define ll long long
const int inf = 1e9;
const int mod = 998244353;
void solve() {
int n, m;
cin >> n >> m;
vector<set<int>> g(n);
vector<ar<int, 2>> edges(m);
for (int i = 0; i < m;i++) {
int u, v;
cin >> u >> v;
--u, --v;
g[u].insert(v);
edges[i] = {u, v};
}
auto check = [&]() {
vector<int> deg(n, 0);
for (int i = 0; i < n;i++)
for (int j : g[i])
deg[j]++;
queue<int> q;
for (int i = 0; i < n;i++)
if (deg[i] == 0)
q.push(i);
int cnt = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v : g[u]) {
deg[v]--;
if (deg[v] == 0)
q.push(v);
}
++cnt;
}
return cnt == n;
};
ll ans = 0;
for (int mask = 0; mask < (1 << m); mask++) {
vector<int> vc;
for (int i = 0; i < m;i++) {
if (mask >> i & 1)
vc.push_back(i);
}
for (int x : vc) {
auto [u, v] = edges[x];
g[u].erase(v);
g[v].insert(u);
}
if (check())
(ans += __builtin_popcount(mask)) %= mod;
for (int x : vc) {
auto [u, v] = edges[x];
g[u].insert(v);
g[v].erase(u);
}
}
cout << ans;
}
int32_t main() {
#ifdef Behruz
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
ios :: sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
solve();
return 0;
}