#include <bits/stdc++.h>
using namespace std;
using lli = unsigned long long;
inline lli make_dp(int u, vector<vector<bool>> &adj) {
  vector<vector<lli>> dp(1 << u);
  for (auto &xs : dp) xs.resize(u);
  int cnt = 0;
  for (int v = 0; v < u; ++v)
    if (adj[v][u]) {
      dp[1 << v][v] = 1;
      ++cnt;
    }
  lli ans = 0;
  for (int mask = 1; mask < (1 << u); ++mask)
    for (int v = 0; v < u; ++v) {
      if (!(mask & (1 << v))) continue;
      if (adj[v][u]) ans += dp[mask][v];
      for (int w = 0; w < u; ++w)
        if (adj[v][w] && !(mask & (1 << w)))
          dp[mask ^ (1 << w)][w] += dp[mask][v];
    }
  return ans - cnt;
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  vector<vector<bool>> adj(n);
  for (auto &us : adj) us.resize(n);
  for (int i = 0; i < m; ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    --u;
    --v;
    adj[u][v] = adj[v][u] = true;
  }
  lli ans = 0;
  for (int u = 0; u < n; ++u) ans += make_dp(u, adj);
  printf("%lld\n", ans / 2);
}
