#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int MOD = 1e9 + 7;
void add(int& a, int b) {
a += b;
if (a >= MOD) a -= MOD;
}
int n, m;
int adj_mat[20][20];
int dp[1 << 20][20]; // dp[mask][i] = Số đường đi xuất phát tại đỉnh 1, đã đi qua các đỉnh trong tập mask,
// mỗi đỉnh đi qua đúng một lần và kết thúc tại đỉnh i
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
--u, --v;
adj_mat[u][v]++;
}
dp[1 << 0][0] = 1;
for (int mask = 0; mask < (1 << n); mask++) {
for (int u = 0; u < n; u++) {
if (dp[mask][u] == 0) continue;
for (int v = 0; v < n; v++) {
if ((mask >> v) & 1) continue;
int next_mask = mask | (1 << v);
add(dp[next_mask][v], 1ll * dp[mask][u] * adj_mat[u][v] % MOD);
}
}
}
cout << dp[(1 << n) - 1][n - 1] << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE1PRCA9IDFlOSArIDc7ICAgCgp2b2lkIGFkZChpbnQmIGEsIGludCBiKSB7CglhICs9IGI7IAoJaWYgKGEgPj0gTU9EKSBhIC09IE1PRDsKfQoKaW50IG4sIG07IAppbnQgYWRqX21hdFsyMF1bMjBdOyAKCmludCBkcFsxIDw8IDIwXVsyMF07IC8vIGRwW21hc2tdW2ldID0gU+G7kSDEkcaw4budbmcgxJFpIHh14bqldCBwaMOhdCB04bqhaSDEkeG7iW5oIDEsIMSRw6MgxJFpIHF1YSBjw6FjIMSR4buJbmggdHJvbmcgdOG6rXAgbWFzaywgCgkJCQkJIC8vICAgICAgICAgICAgICAgbeG7l2kgxJHhu4luaCDEkWkgcXVhIMSRw7puZyBt4buZdCBs4bqnbiB2w6Aga+G6v3QgdGjDumMgdOG6oWkgxJHhu4luaCBpIAoKaW50IG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IAoJY2luLnRpZShudWxscHRyKTsgCQoJY2luID4+IG4gPj4gbTsgCQoKCWZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CgkJaW50IHUsIHY7IAoJCWNpbiA+PiB1ID4+IHY7IAoJCS0tdSwgLS12OyAKCQlhZGpfbWF0W3VdW3ZdKys7IAoJfQoKCWRwWzEgPDwgMF1bMF0gPSAxOyAgIAoJZm9yIChpbnQgbWFzayA9IDA7IG1hc2sgPCAoMSA8PCBuKTsgbWFzaysrKSB7CgkJZm9yIChpbnQgdSA9IDA7IHUgPCBuOyB1KyspIHsKCQkJaWYgKGRwW21hc2tdW3VdID09IDApIGNvbnRpbnVlOyAKCQkJZm9yIChpbnQgdiA9IDA7IHYgPCBuOyB2KyspIHsKCQkJCWlmICgobWFzayA+PiB2KSAmIDEpIGNvbnRpbnVlOyAKCQkJCWludCBuZXh0X21hc2sgPSBtYXNrIHwgKDEgPDwgdik7ICAKCQkJCWFkZChkcFtuZXh0X21hc2tdW3ZdLCAxbGwgKiBkcFttYXNrXVt1XSAqIGFkal9tYXRbdV1bdl0gJSBNT0QpOyAKCQkJfQoJCX0KCX0KCgljb3V0IDw8IGRwWygxIDw8IG4pIC0gMV1bbiAtIDFdIDw8ICdcbic7IAp9