#include <bits/stdc++.h>
using namespace std;
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, -1, 0, 1};
bool graph[20][20];
int lowbit[524288];
long long dp[524288][20];
long long ans;
int n, m, mask;
int main(int argc, char const *argv[]) {
  ios::sync_with_stdio(false);
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    a--, b--;
    graph[a][b] = graph[b][a] = 1;
  }
  int i1, j1;
  for (i1 = 1; i1 < (1 << n); i1++) {
    for (j1 = 0;; j1++)
      if (i1 & (1 << j1)) break;
    lowbit[i1] = j1;
  }
  for (int i = 0; i < n; i++) dp[(1 << i)][i] = 1;
  for (mask = 0; mask < (1 << n); mask++)
    for (int i = 0; i < n; i++)
      if (dp[mask][i] > 0)
        for (int j = lowbit[mask] + 1; j < n; j++)
          if ((graph[i][j]) && (!(mask & (1 << j))))
            dp[(mask | (1 << j))][j] += dp[mask][i];
  for (mask = 0; mask < (1 << n); mask++)
    if (__builtin_popcount(mask) >= 3)
      for (int i = 0; i < n; i++)
        if (graph[i][lowbit[mask]]) ans += dp[mask][i];
  cout << ans / 2;
  return 0;
}
