#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
int n, m;
int adj_mat[19][19];
vector<int> adj[19];
ll dp[1 << 19][19];
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] = adj_mat[v][u] = 1;
adj[u].push_back(v);
adj[v].push_back(u);
}
// Đối với mỗi chu trình thì ta lấy đỉnh có số hiệu nhỏ nhất để làm đỉnh đại diện
// Khi đó mỗi chu trình sẽ bị đếm qua 2 lần
ll ans = 0;
for (int s = 0; s < n; s++) { // Đỉnh đại diện s
// dp[mask][v] = Số đường đi xuất phát tại đỉnh s, với s là đỉnh có số hiệu nhỏ nhất,
// đi qua các đỉnh có trong mask, mỗi đỉnh đúng một lần và kết thúc tại đỉnh v
for (int mask = 0; mask < (1 << n); mask++) {
for (int v = 0; v < n; v++) {
ll& cur = dp[mask][v];
if (mask == (1 << v) && v == s) {
cur = 1;
continue;
}
cur = 0;
if (!(mask & (1 << s))) continue;
if (!(mask & (1 << v))) continue;
if (v < s) continue;
for (int u : adj[v]) {
int prev_mask = mask ^ (1 << v);
dp[mask][v] += dp[prev_mask][u];
}
}
}
for (int mask = 0; mask < (1 << n); mask++) {
int len = __builtin_popcount(mask);
if (len < 3) continue;
for (int v = s; v < n; v++) {
ans += dp[mask][v] * adj_mat[v][s];
}
}
}
ans /= 2;
cout << ans << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKaW50IG4sIG07ICAKaW50IGFkal9tYXRbMTldWzE5XTsgCnZlY3RvcjxpbnQ+IGFkalsxOV07IAoKbGwgZHBbMSA8PCAxOV1bMTldOyAKCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAKCWNpbi50aWUobnVsbHB0cik7IAkKCWNpbiA+PiBuID4+IG07IAoKCWZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CgkJaW50IHUsIHY7IAoJCWNpbiA+PiB1ID4+IHY7IAoJCS0tdSwgLS12OyAKCQlhZGpfbWF0W3VdW3ZdID0gYWRqX21hdFt2XVt1XSA9IDE7CgkJYWRqW3VdLnB1c2hfYmFjayh2KTsgCgkJYWRqW3ZdLnB1c2hfYmFjayh1KTsgCgl9CgoJLy8gxJDhu5FpIHbhu5tpIG3hu5dpIGNodSB0csOsbmggdGjDrCB0YSBs4bqleSDEkeG7iW5oIGPDsyBz4buRIGhp4buHdSBuaOG7jyBuaOG6pXQgxJHhu4MgbMOgbSDEkeG7iW5oIMSR4bqhaSBkaeG7h24KCS8vIEtoaSDEkcOzIG3hu5dpIGNodSB0csOsbmggc+G6vSBi4buLIMSR4bq/bSBxdWEgMiBs4bqnbgoJbGwgYW5zID0gMDsgCglmb3IgKGludCBzID0gMDsgcyA8IG47IHMrKykgeyAvLyDEkOG7iW5oIMSR4bqhaSBkaeG7h24gcwoJCS8vIGRwW21hc2tdW3ZdID0gU+G7kSDEkcaw4budbmcgxJFpIHh14bqldCBwaMOhdCB04bqhaSDEkeG7iW5oIHMsIHbhu5tpIHMgbMOgIMSR4buJbmggY8OzIHPhu5EgaGnhu4d1IG5o4buPIG5o4bqldCwgCgkJLy8gICAgICAgICAgICAgICDEkWkgcXVhIGPDoWMgxJHhu4luaCBjw7MgdHJvbmcgbWFzaywgbeG7l2kgxJHhu4luaCDEkcO6bmcgbeG7mXQgbOG6p24gdsOgIGvhur90IHRow7pjIHThuqFpIMSR4buJbmggdgoJCWZvciAoaW50IG1hc2sgPSAwOyBtYXNrIDwgKDEgPDwgbik7IG1hc2srKykgewkJCQoJCQlmb3IgKGludCB2ID0gMDsgdiA8IG47IHYrKykgewoJCQkJbGwmIGN1ciA9IGRwW21hc2tdW3ZdOwoJCQkJaWYgKG1hc2sgPT0gKDEgPDwgdikgJiYgdiA9PSBzKSB7CgkJCQkJY3VyID0gMTsgCgkJCQkJY29udGludWU7ICAKCQkJCX0gCgkJCQljdXIgPSAwOyAgCgkJCQlpZiAoIShtYXNrICYgKDEgPDwgcykpKSBjb250aW51ZTsgIAoJCQkJaWYgKCEobWFzayAmICgxIDw8IHYpKSkgY29udGludWU7IAoJCQkJaWYgKHYgPCBzKSBjb250aW51ZTsKCQkJCWZvciAoaW50IHUgOiBhZGpbdl0pIHsgIAoJCQkJCWludCBwcmV2X21hc2sgPSBtYXNrIF4gKDEgPDwgdik7ICAgCgkJCQkJZHBbbWFza11bdl0gKz0gZHBbcHJldl9tYXNrXVt1XTsgCgkJCQl9CgkJCX0KCQl9CgoJCWZvciAoaW50IG1hc2sgPSAwOyBtYXNrIDwgKDEgPDwgbik7IG1hc2srKykgewoJCQlpbnQgbGVuID0gX19idWlsdGluX3BvcGNvdW50KG1hc2spOyAKCQkJaWYgKGxlbiA8IDMpIGNvbnRpbnVlOyAKCQkJZm9yIChpbnQgdiA9IHM7IHYgPCBuOyB2KyspIHsKCQkJCWFucyArPSBkcFttYXNrXVt2XSAqIGFkal9tYXRbdl1bc107IAoJCQl9CgkJfQoJfQoKCWFucyAvPSAyOyAgCgoJY291dCA8PCBhbnMgPDwgJ1xuJzsgCn0=