#include <bits/stdc++.h>
using namespace std;
int n, m;
long long dp[(1 << 19)][20];
int lowbit[(1 << 19)];
bool G[20][20];
int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n >> m;
  for (int i = 1; i < (1 << 19); ++i) {
    int j;
    for (j = 0;; ++j) {
      if ((i & (1 << j))) {
        break;
      }
    }
    lowbit[i] = j;
  }
  for (int i = 0; i < m; ++i) {
    int a, b;
    cin >> a >> b;
    G[--a][--b] = 1, G[b][a] = 1;
  }
  for (int i = 0; i < n; ++i) {
    dp[(1 << i)][i] = 1;
  }
  for (int mask = 1; 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 ((!(mask & (1 << j))) && (G[i][j])) {
            dp[mask | (1 << j)][j] += dp[mask][i];
          }
        }
      }
    }
  }
  long long ans = 0;
  for (int mask = 1; mask < (1 << n); ++mask) {
    if (__builtin_popcount(mask) >= 3) {
      for (int i = 0; i < n; ++i) {
        if (G[i][lowbit[mask]]) {
          ans += dp[mask][i];
        }
      }
    }
  }
  cout << ans / 2 << '\n';
  return 0;
}
