#include<bits/stdc++.h>
using namespace std;
// Số modulo theo đề bài (vì kết quả có thể rất lớn)
const int MOD = 1e9 + 7;
int n, m;
// Đồ thị lưu danh sách kề (chuyển về 0-index: 0 đến n-1)
vector<int> adj[20];
// Bảng DP:
// dp[mask][u]: Số cách đi qua các thành phố trong tập 'mask' và kết thúc tại 'u'
// 1 << 20 tương đương 2^20 (khoảng 1 triệu trạng thái)
long long dp[1 << 20][20];
int main(){
// Tối ưu tốc độ nhập xuất
cin.tie(0)->sync_with_stdio(0);
// Nếu nộp bài trên máy chấm có file thì mở file, không thì thôi
if(fopen("Hamiltonian_Flights.inp","r")){
freopen("Hamiltonian_Flights.inp","r",stdin);
freopen("Hamiltonian_Flights.out","w",stdout);
}
cin >> n >> m;
for(int i = 0; i < m; i++){
int u, v; cin >> u >> v;
// Chuyển đỉnh từ 1..n về 0..n-1 để thao tác bit dễ dàng (bit 0 đến bit n-1)
adj[u-1].push_back(v-1);
}
// --- CƠ SỞ QUY HOẠCH ĐỘNG ---
// Ban đầu chỉ có thành phố xuất phát (đỉnh 0) được thăm.
// Mask = 1 (nhị phân ...0001) nghĩa là chỉ bật bit 0.
// Kết thúc tại đỉnh 0.
// Số cách là 1.
dp[1][0] = 1;
// --- DUYỆT CÁC TRẠNG THÁI ---
// Duyệt tất cả các trạng thái mask từ 1 đến 2^n - 1
for(int s = 1; s < (1 << n); s++){
// Điều kiện 1: Hành trình BẮT BUỘC phải chứa đỉnh xuất phát (bit 0)
// Kiểm tra bit thứ 0 của s. Nếu tắt -> Bỏ qua trường hợp này.
if(!((s >> 0) & 1)) continue;
// Duyệt đỉnh 'u' mà ta đang đứng hiện tại (u phải nằm trong tập s)
for(int u = 0; u < n; u++){
// Nếu u không có trong tập s -> Vô lý -> Bỏ qua
if(!((s >> u) & 1)) continue;
// Nếu chưa có đường nào đi đến trạng thái này -> Bỏ qua để đỡ tốn time
if(dp[s][u] == 0) continue;
// --- CHUYỂN TRẠNG THÁI (PUSH DP) ---
// Từ đỉnh u, thử đi tiếp sang các đỉnh kề v
for(int v : adj[u]){
// Nếu v đã có trong tập s rồi -> Tức là đã thăm v trước đó
// -> Không được thăm lại (vì đây là đường đi đơn) -> Bỏ qua
if((s >> v) & 1) continue;
// Điều kiện 2 (QUAN TRỌNG NHẤT): Về đích sớm
// Nếu v là đỉnh đích (n-1), ta chỉ được phép bước vào v
// KHI VÀ CHỈ KHI ta đã đi hết tất cả các thành phố khác.
// Kiểm tra: Nếu v là đích VÀ mask mới chưa full (chưa bật hết bit) -> Bỏ
if(v == n-1 && (s | (1 << v)) != ((1 << n) - 1)) continue;
// Tính mask mới khi thêm v vào hành trình
// Dùng phép OR để bật bit thứ v
int next_s = s | (1 << v);
// Cộng dồn số cách:
// Số cách đến [next_s][v] += Số cách đến [s][u]
dp[next_s][v] = (dp[next_s][v] + dp[s][u]) % MOD;
}
}
}
// Kết quả là số cách đi full tất cả thành phố (mask full = 2^n - 1)
// và kết thúc tại đỉnh đích (n-1)
cout << dp[(1 << n) - 1][n-1];
return 0;
}