#include <bits/stdc++.h>
typedef long long ll;
#define pb push_back
using namespace std;
int n, m;
const int mod = 1e9 + 7;
// Faktorial = 20! Tinggi O(N!)
const int N = 20;
ll dp[N][1 << N]; // Change type to ll to match rec return type
vector<int> adj[N];
ll rec(int cur, int mask) {
if (cur == (n - 1) && mask == ((1 << n) - 1)) return 1;
if (cur == (n - 1)) return 0;
if (dp[cur][mask] != -1) return dp[cur][mask];
int ans = 0;
for (auto neighbour : adj[cur]) {
// neighbour = 1
// Cek jika neighbour sudah divisit atau belom
if ((1 << neighbour) & mask) continue;
(ans += rec(neighbour, mask | (1 << neighbour))) %= mod;
}
return dp[cur][mask] = ans;
}
int main() {
cin.tie(0) -> sync_with_stdio(false), cout.tie(0);
// bikin jadi 0 indexing
cin >> n >> m;
memset(dp, -1, sizeof dp);
while (m--) {
int u, v;
cin >> u >> v;
u--, v--;
adj[u].pb(v);
}
cout << rec(0, 1) << "\n";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsKI2RlZmluZSBwYiBwdXNoX2JhY2sKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBuLCBtOwpjb25zdCBpbnQgbW9kID0gMWU5ICsgNzsKLy8gRmFrdG9yaWFsID0gMjAhIFRpbmdnaSBPKE4hKQpjb25zdCBpbnQgTiA9IDIwOwpsbCBkcFtOXVsxIDw8IE5dOyAvLyBDaGFuZ2UgdHlwZSB0byBsbCB0byBtYXRjaCByZWMgcmV0dXJuIHR5cGUKdmVjdG9yPGludD4gYWRqW05dOwoKbGwgcmVjKGludCBjdXIsIGludCBtYXNrKSB7CiAgICBpZiAoY3VyID09IChuIC0gMSkgJiYgbWFzayA9PSAoKDEgPDwgbikgLSAxKSkgcmV0dXJuIDE7CiAgICBpZiAoY3VyID09IChuIC0gMSkpIHJldHVybiAwOwogICAgaWYgKGRwW2N1cl1bbWFza10gIT0gLTEpIHJldHVybiBkcFtjdXJdW21hc2tdOwogICAgaW50IGFucyA9IDA7CiAgICBmb3IgKGF1dG8gbmVpZ2hib3VyIDogYWRqW2N1cl0pIHsKICAgICAgICAvLyBuZWlnaGJvdXIgPSAxCiAgICAgICAgLy8gQ2VrIGppa2EgbmVpZ2hib3VyIHN1ZGFoIGRpdmlzaXQgYXRhdSBiZWxvbQogICAgICAgIGlmICgoMSA8PCBuZWlnaGJvdXIpICYgbWFzaykgY29udGludWU7CiAgICAgICAgKGFucyArPSByZWMobmVpZ2hib3VyLCBtYXNrIHwgKDEgPDwgbmVpZ2hib3VyKSkpICU9IG1vZDsKICAgIH0KICAgIHJldHVybiBkcFtjdXJdW21hc2tdID0gYW5zOwp9CgppbnQgbWFpbigpIHsKICAgIGNpbi50aWUoMCkgLT4gc3luY193aXRoX3N0ZGlvKGZhbHNlKSwgY291dC50aWUoMCk7CiAgICAvLyBiaWtpbiBqYWRpIDAgaW5kZXhpbmcKICAgIGNpbiA+PiBuID4+IG07CiAgICBtZW1zZXQoZHAsIC0xLCBzaXplb2YgZHApOwogICAgd2hpbGUgKG0tLSkgewogICAgICAgIGludCB1LCB2OwogICAgICAgIGNpbiA+PiB1ID4+IHY7CiAgICAgICAgdS0tLCB2LS07CiAgICAgICAgYWRqW3VdLnBiKHYpOwogICAgfQogICAgY291dCA8PCByZWMoMCwgMSkgPDwgIlxuIjsKICAgIHJldHVybiAwOwp9