#include <bits/stdc++.h>
using namespace std;
const int N = 17 + 3;
long long ans, dp[1 << N][N];
vector<int> adj[N];
bool e[N][N];
int n, m;
void input() {
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    --u, --v;
    e[u][v] = e[v][u] = true;
    adj[u].push_back(v);
    adj[v].push_back(u);
    dp[(1 << u) | (1 << v)][max(u, v)] = 1;
  }
}
void make() {
  for (int i = 0; i < n; i++) dp[1 << i][i] = 1;
  for (int mask = 0; mask < (1 << n); mask++) {
    int s = __builtin_ctz(mask);
    for (int i = 0; i < n; i++) {
      if ((mask >> i & 1) && s != i)
        for (auto x : adj[i])
          if (x != s && (mask >> x & 1)) dp[mask][i] += dp[mask ^ (1 << i)][x];
      if (__builtin_popcount(mask) > 2 && mask >> i & 1 &&
          e[__builtin_ctz(mask)][i])
        ans += dp[mask][i];
    }
  }
}
int32_t main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  input(), make();
  cout << ans / 2 << endl;
  return 0;
}
