#include <bits/stdc++.h>
#define int long long
#define ii pair<int, int>
#define st first
#define nd second
#define vi vector<int>
#define pb push_back
#define spc << " " <<
#define MX 300005
#define MOD 998244353
#define inf 1e15
using namespace std;
int dp[(1<<19)-1];
int add(int x, int y){
if(x+y>=MOD) return x+y-MOD;
return x+y;
}
int mult(int x, int y){
return (x*y)%MOD;
}
void solve(){
int fact[19];
fact[0]=1;
for(int i=1; i<=18; i++) fact[i]=mult(fact[i-1],i);
int n,m; cin >> n >> m;
bitset<18> edg[n];
for(int i=1; i<=m; i++){
int a,b; cin >> a >> b; a--; b--;
edg[a].set(b);
}
dp[0]=0;
for(int mask=1; mask<(1<<n); mask++){
dp[mask]=0;
int cnt=__builtin_popcount(mask);
bitset<18> bm;
bm=mask;
for(int i=0; i<18; i++){
if(!((1<<i)&mask)) continue;
dp[mask]=add(dp[mask], add(dp[mask^(1<<i)], mult(fact[cnt-1], (edg[i]&bm).count())));
}
}
cout << dp[(1<<n)-1] << endl;
}
signed main(){
ios_base::sync_with_stdio(false); cin.tie(0);
#ifdef Local
freopen("in", "r", stdin);
freopen("out", "w", stdout);
#endif
solve();
}