#include <bits/stdc++.h>
using namespace std;
int N, M;
vector<int> edge[19 + 1];
long long F[1 << 19][19 + 1];
long long ans = 0LL;
inline int GetStart(const int x) {
  for (int i = 0; i < 19; i++)
    if ((1 << i) & x) return i + 1;
  return -1;
}
int main() {
  scanf("%d %d", &N, &M);
  for (int i = 1; i <= M; i++) {
    int a, b;
    scanf("%d %d", &a, &b);
    edge[a].push_back(b);
    edge[b].push_back(a);
  }
  memset(F, 0, sizeof F);
  for (int i = 1; i <= N; i++)
    for (vector<int>::iterator j = edge[i].begin(); j != edge[i].end(); j++)
      if ((*j) > i) F[(1 << (i - 1)) | (1 << (*j - 1))][*j] = 1LL;
  for (int i = 1; i < (1 << 19); i++) {
    int Start = GetStart(i);
    for (int j = Start; j <= N; j++)
      if (F[i][j])
        for (vector<int>::iterator k = edge[j].begin(); k != edge[j].end();
             k++) {
          if ((*k == Start) && (i != ((1 << (j - 1)) | (1 << (*k - 1)))))
            ans += F[i][j];
          if ((*k) > Start && (i & (1 << (*k - 1))) == 0)
            F[i | (1 << (*k - 1))][*k] += F[i][j];
        }
  }
  printf("%I64d\n", ans / 2);
  return 0;
}
