#include <bits/stdc++.h>
using namespace std;
const int N = 19;
long long dp[(1 << N)][N], g[N][N], ans;
vector<int> nei[N];
int main() {
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    u--;
    v--;
    nei[u].push_back(v);
    nei[v].push_back(u);
    g[u][v] = 1;
    g[v][u] = 1;
  }
  for (int mask = 1; mask < (1 << n); mask++) {
    int mn;
    for (int i = 0; i < n; i++) {
      if ((mask & (1 << i))) {
        mn = i;
        break;
      }
    }
    if (__builtin_popcount(mask) == 1) {
      dp[mask][mn] = 1;
      continue;
    }
    for (int i = 0; i < n; i++) {
      if (i == mn || (mask & (1 << i)) == 0) continue;
      for (int j = 0; j < nei[i].size(); j++) {
        int v = nei[i][j];
        if (mask & (1 << v)) dp[mask][i] += dp[mask - (1 << i)][v];
      }
      if (g[mn][i] && 2 < __builtin_popcount(mask)) {
        ans += dp[mask][i];
      }
    }
  }
  cout << ans / 2;
}
