#include <bits/stdc++.h>
using namespace std;
const int N = 19;
template <typename T>
inline void read(T &AKNOI) {
  T x = 0, flag = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') flag = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = (x << 1) + (x << 3) + ch - '0';
    ch = getchar();
  }
  AKNOI = flag * x;
}
int n, m, g[N][N], lg2[1 << N];
long long dp[1 << N][N], ans;
void init() {
  read(n);
  read(m);
  for (int i = 1; i <= m; ++i) {
    int u, v;
    read(u);
    read(v);
    --u;
    --v;
    g[u][v] = g[v][u] = 1;
  }
}
void solve() {
  for (int i = 0; i < n; ++i) {
    dp[1 << i][i] = 1;
    lg2[1 << i] = i;
  }
  for (int s = 1, full = (1 << n); s < full; ++s) {
    int u = lg2[s & (-s)];
    for (int j = 0; j < n; ++j) {
      if (((s >> j) & 1) && dp[s][j]) {
        for (int k = u; k < n; ++k) {
          if (!g[j][k]) continue;
          if ((s >> k) & 1) {
            if (s == ((1 << j) | (1 << k))) continue;
            if (k == u) ans += dp[s][j];
          } else {
            dp[s | (1 << k)][k] += dp[s][j];
          }
        }
      }
    }
  }
  printf("%lld\n", ans / 2);
}
int main() {
  init();
  solve();
  return 0;
}
