#include <bits/stdc++.h>
using namespace std;
long long dp[1 << 20][20], ans;
bool arc[20][20];
int cnt(int x) {
  int t = 0;
  while (x) t += x % 2, x >>= 1;
  return t;
}
int first(int x) {
  int i;
  for (i = 0; i < 20; i++)
    if (x & (1 << i)) break;
  return i;
}
int main() {
  int n, m;
  while (~scanf("%d%d", &n, &m)) {
    memset(arc, false, sizeof(arc));
    while (m--) {
      int x, y;
      scanf("%d%d", &x, &y);
      x--, y--;
      arc[x][y] = arc[y][x] = true;
    }
    memset(dp, 0, sizeof(dp));
    ans = 0;
    for (int i = 0; i < n; i++) dp[1 << i][i] = 1;
    for (int t = 1; t < (1 << n); t++) {
      int sp = first(t);
      for (int x = 0; x < n; x++)
        if ((t & (1 << x)) && dp[t][x])
          for (int i = sp; i < n; i++)
            if (arc[x][i]) {
              if (t & (1 << i)) {
                if ((1 << i | 1 << x) == t) continue;
                if (i == sp) ans += dp[t][x];
              } else
                dp[t | (1 << i)][i] += dp[t][x];
            }
    }
    printf("%I64d\n", ans / 2);
  }
  return 0;
}
