#include <bits/stdc++.h>
using namespace std;
const long long N = 20;
long long n, m, dp[N][1 << N], B, res, cb[1 << N];
bool used[N][1 << N], w[N][N];
long long cbit(long long x) {
  long long c = 0;
  while (x) {
    c += x & 1;
    x /= 2;
  }
  return c;
}
signed main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n >> m;
  for (long long i = 0; i < m; ++i) {
    long long a, b;
    cin >> a >> b;
    a--;
    b--;
    w[a][b] = 1;
    w[b][a] = 1;
  }
  B = 1 << n;
  for (long long i = 0; i < B; ++i) cb[i] = cbit(i);
  queue<pair<long long, long long>> q;
  for (long long i = 0; i < n; ++i) {
    for (long long j = 0; j < n; ++j) {
      for (long long ma = 0; ma < B; ++ma) {
        dp[j][ma] = 0;
        used[j][ma] = 0;
      }
    }
    q.push({i, 1 << i});
    dp[i][1 << i] = 1;
    while (!q.empty()) {
      long long v = q.front().first, mask = q.front().second, nmask;
      q.pop();
      for (long long u = i; u < n; ++u) {
        nmask = mask | (1 << u);
        if (nmask == mask || !w[u][v]) continue;
        dp[u][nmask] += dp[v][mask];
        if (!used[u][nmask]) {
          used[u][nmask] = 1;
          q.push({u, nmask});
        }
      }
    }
    long long av = 0;
    for (long long j = 0; j < n; ++j) {
      for (long long mask = 0; mask < B; ++mask) {
        if (cb[mask] >= 3 && w[i][j] && dp[j][mask]) {
          av += dp[j][mask];
        }
      }
    }
    res += av / 2;
  }
  cout << res << '\n';
}
