#include <bits/stdc++.h>
int start, n, m;
bool edge[25][25];
long long memory[25][(1 << 19) + 5];
long long dfs(int u, int mask) {
  if (memory[u][mask] != -1) return memory[u][mask];
  int visit = 0;
  for (int i = 0; i < n; i++) {
    if (mask & (1 << i)) visit++;
  }
  long long result = 0;
  if (visit >= 3 && edge[u][start]) result = 1;
  for (int v = 0; v <= start; v++) {
    if (!edge[u][v]) {
      continue;
    }
    if (mask & (1 << v)) {
      continue;
    }
    result += dfs(v, mask | (1 << v));
  }
  memory[u][mask] = result;
  return result;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < m; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    u--;
    v--;
    edge[u][v] = edge[v][u] = true;
  }
  long long answer = 0;
  for (start = 0; start < n; start++) {
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < 1 << n; j++) {
        memory[i][j] = -1;
      }
    }
    answer += dfs(start, 1 << start);
  }
  printf("%lld\n", answer / 2);
}
