#include <bits/stdc++.h>
using namespace std;
long long int dp[1 << 20][20];
vector<int> G[50];
bool edge_list[50][50];
int func(int x) {
  int y = ((x) & (-x));
  int cnt = 0;
  while (y > 0) {
    y = y / 2;
    cnt++;
  }
  return cnt - 1;
}
int main() {
  std::ios::sync_with_stdio(false);
  cin.tie(0);
  int t, i, n, e, mask;
  cin >> n >> e;
  for (i = 0; i < e; i++) {
    int u, v;
    cin >> u >> v;
    u--;
    v--;
    G[u].push_back(v);
    G[v].push_back(u);
    edge_list[u][v] = 1;
    edge_list[v][u] = 1;
  }
  int lim = 1 << n;
  for (mask = 0; mask < lim; mask++) {
    for (i = 0; i < n; i++) {
      if (__builtin_popcount(mask) == 1 && (mask & (1 << i))) {
        dp[mask][i] = 1LL;
      } else if (__builtin_popcount(mask) > 1 && (mask & (1 << i))) {
        long long int sum = 0LL;
        for (int j = 0; j < n; j++) {
          if (edge_list[i][j] == 1 && (mask & (1 << j)) && i != func(mask))
            sum += dp[mask ^ (1 << i)][j];
        }
        dp[mask][i] = sum;
      } else
        dp[mask][i] = 0LL;
    }
  }
  long long int ans = 0;
  for (mask = 0; mask < lim; mask++) {
    for (i = 0; i < n; i++) {
      if (__builtin_popcount(mask) >= 3 && (edge_list[func(mask)][i] == 1))
        ans += dp[mask][i];
    }
  }
  cout << ans / (long long int)2;
  return 0;
}
