#include <bits/stdc++.h>
using namespace std;
void Openfile() {
  ios_base ::sync_with_stdio(false);
  cin.tie(0);
}
const int maxN = 1e5 + 5;
const int maxM = 1e6 + 5;
const long long INF = 1e9 + 7;
int N, M;
bool a[20][20];
long long dp[(1 << 19)][20];
void Init() { memset(dp, (-1), sizeof(dp)); }
void Enter() {
  cin >> N >> M;
  for (int i = 1, _b = M; i <= _b; ++i) {
    int u, v;
    cin >> u >> v;
    a[u][v] = a[v][u] = true;
  }
}
inline int firstBit(int x) {
  for (int i = 1, _b = N; i <= _b; ++i) {
    if ((x >> (i - 1)) & 1) return i;
  }
}
long long Process(long long State, int cur) {
  if (__builtin_popcount(State) == 2) {
    int s = firstBit(State);
    State ^= (1 << (s - 1));
    int t = firstBit(State);
    return a[s][t];
  }
  long long &res = dp[State][cur];
  if (res != -1) {
    return res;
  }
  res = 0;
  int s = firstBit(State);
  for (int i = s + 1, _b = N; i <= _b; ++i) {
    if (((State >> (i - 1)) & 1) && a[cur][i]) {
      res = res + Process(State ^ (1 << (cur - 1)), i);
    }
  }
  return res;
}
void Solve() {
  long long ans = 0;
  for (int State = 0, _a = (1 << N); State < _a; ++State) {
    if (__builtin_popcount(State) < 3) continue;
    int s = firstBit(State);
    for (int i = s + 1, _b = N; i <= _b; ++i) {
      if (((State >> (i - 1)) & 1) && a[s][i]) {
        ans = ans + Process(State, i);
      }
    }
  }
  cout << ans / 2 << '\n';
}
int main() {
  Openfile();
  Init();
  Enter();
  Solve();
  return 0;
}
