#include <bits/stdc++.h>
using namespace std;
const int MOD(1000000007);
const int INF((1 << 30) - 1);
const int MAXN(25);
int n, m, g[MAXN][MAXN], visited[(1 << 19) + 5][MAXN];
long long dp[(1 << 19) + 5][MAXN];
long long DP(int mask, int now, int st) {
  if (visited[mask][now] == st + 1) return dp[mask][now];
  long long ret = 0;
  for (int i = st; i <= n - 1; i++)
    if (g[now][i]) {
      if (i == st) {
        if (mask != ((1 << st) + (1 << now))) ret++;
      } else {
        if (!(mask & (1 << i))) ret += DP(mask | (1 << i), i, st);
      }
    }
  visited[mask][now] = st + 1;
  return dp[mask][now] = ret;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < m; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    u--, v--;
    g[u][v] = g[v][u] = 1;
  }
  long long ans = 0;
  for (int i = 0; i < n; i++) ans += DP(1 << i, i, i);
  cout << ans / 2;
}
