#include <bits/stdc++.h>
using namespace std;
int main() {
  int n, m;
  cin >> n >> m;
  vector<int> adj[n];
  int64_t dp[1 << n][n];
  memset(dp, 0, sizeof dp);
  for (int i = 0; i < m; ++i) {
    int u, v;
    cin >> u >> v;
    --u;
    --v;
    adj[u].emplace_back(v);
    adj[v].emplace_back(u);
  }
  for (int mask = 0; mask < (1 << n); ++mask)
    for (int i = 0; i < n; ++i)
      if (__builtin_popcount(mask) == 1 && (mask & (1 << i))) dp[mask][i] = 1;
  auto LSB = [&](int n) {
    for (int i = 0;; ++i)
      if (n & (1 << i)) return i;
  };
  for (int mask = 0; mask < (1 << n); ++mask)
    if (__builtin_popcount(mask) > 1)
      for (int i = 0; i < n; ++i)
        if (LSB(mask) != i && (mask & (1 << i)))
          for (int j : adj[i]) dp[mask][i] += dp[mask ^ (1 << i)][j];
  int64_t ans = 0;
  for (int mask = 0; mask < (1 << n); ++mask)
    for (int i = 0; i < n; ++i)
      if (__builtin_popcount(mask) >= 3 && LSB(mask) != i)
        if (find(adj[i].begin(), adj[i].end(), LSB(mask)) != adj[i].end())
          ans += dp[mask][i];
  cout << ans / 2 << '\n';
}
