#include <bits/stdc++.h>
using namespace std;
const int N = 20;
long long n, m, dp[1 << 20][21];
bool edge[N][N];
bool tmam(long long node, long long from, long long num) {
  int x = __builtin_ffs(num) - 1;
  if (((1 << from) & num) && edge[node][from] && node != x) return 1;
  return 0;
}
void solve() {
  for (int i = 0; i < n; i++) dp[1 << i][i] = 1;
  for (int i = 0; i < (1 << n); i++) {
    for (int j = 0; j < n; j++) {
      for (int k = 0; k < n; k++) {
        if (tmam(j, k, i)) {
          dp[i][j] += dp[i ^ (1 << j)][k];
        }
      }
    }
  }
  long long ans = 0;
  for (int i = 0; i < (1 << n); i++) {
    if (__builtin_popcount(i) < 3) continue;
    for (int j = 0; j < n; j++) {
      if (i & (1 << j) && j != __builtin_ffs(i) - 1) {
        int node = __builtin_ffs(i) - 1, ch = j;
        if (edge[node][ch]) ans += dp[i][j];
      }
    }
  }
  cout << ans / 2 << '\n';
}
int main() {
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int x, y;
    cin >> x >> y;
    x--, y--;
    edge[x][y] = 1, edge[y][x] = 1;
  }
  solve();
  return 0;
}
