#include <bits/stdc++.h>
using namespace std;
const int N=18;
using ll=long long;
const ll mod=998244353;
ll dp[1<<N];
ll fact[N];
int n,m;
struct graf {
int a,tip;
};
vector<graf>adj[N+1];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
fact[0]=1;
for (int i=1;i<=n;i++) {
fact[i]=(fact[i-1]*i)%mod;
}
for (int i=1;i<=m;i++) {
int a,b;
cin>>a>>b;
adj[a].push_back({b,0});
adj[b].push_back({a,1});
}
for (int mask=1;mask<(1<<n);mask++) {
if (__builtin_popcount((mask))==1)
continue;
vector<ll>cost(n+1,0);
for (int bit=0;bit<n;bit++) {
if (!(mask&(1<<bit)))
continue;
for (auto [u,k]:adj[bit+1]) {
cost[u]+=k;
}
}
for (int bit=0;bit<n;bit++) {
if (mask&(1<<bit)) {
ll val=__builtin_popcount((mask^(1<<bit)));
ll modes=fact[val];
/*if (mask==(1<<n)-1&&bit==0) {
cout<<cost[bit+1]<<" "<<"huh"<<" "<<modes<<" "<<val<<" "<<mask<<endl;
}*/
dp[mask]=(dp[mask]+dp[mask^(1<<bit)]+modes*cost[bit+1]%mod)%mod;
}
}
}
cout<<dp[(1<<n)-1];
return 0;
}