#include <bits/stdc++.h>
using namespace std;
int count_bits(int n) {
  int out = 0;
  while (n) {
    n = n & (n - 1);
    out++;
  }
  return out;
}
int i_bit(int n, int i) { return ((n | (1 << i)) == n); }
int first(int n) {
  if (!n) return -1;
  int pos = 0;
  while (!(n & 1)) n >>= 1, pos++;
  return pos;
}
long long solve(const vector<int>& graph) {
  int n = graph.size();
  vector<vector<long long> > dp((1 << n), vector<long long>(n, 0));
  for (int mask = 0; mask < (1 << n); mask++) {
    for (int i = 0; i < n; i++) {
      int cb = count_bits(mask), ib = i_bit(mask, i);
      if (cb == 1 && ib)
        dp[mask][i] = 1;
      else if (cb > 1 && ib) {
        for (int j = 0; j < n; j++)
          if (i_bit(mask, j) && i_bit(graph[j], i) && first(mask) != i)
            dp[mask][i] += dp[mask ^ (1 << i)][j];
      }
    }
  }
  long long out = 0;
  for (int mask = 0; mask < (1 << n); mask++)
    for (int i = 0; i < n; i++)
      if (count_bits(mask) > 2 && i_bit(graph[first(mask)], i))
        out += dp[mask][i];
  return out / 2;
}
int main() {
  int n, m;
  cin >> n >> m;
  vector<int> g(n);
  for (int i = 0, a, b; i < m; i++) {
    cin >> a >> b;
    a--, b--;
    g[a] |= (1 << b), g[b] |= (1 << a);
  }
  cout << solve(g) << endl;
  return 0;
}
