#include <bits/stdc++.h>
using namespace std;
const long long inf = 0x3f3f3f3f;
const double eps = 1e-6;
const long long mod = 1000000007;
inline string getstr(string &s, long long l, long long r) {
  string ret = "";
  for (long long i = l; i <= r; i++) ret.push_back(s[i]);
  return ret;
}
long long modpow(long long x, long long y, long long md = mod) {
  if (y == 0) return 1;
  long long ret = modpow(x, y >> 1, md);
  ret = (long long)ret * ret % md;
  if (y & 1) ret = (long long)ret * x % md;
  return ret;
}
long long n, m, ans;
long long g[22][22];
long long dp[20][1 << 19];
void calc(long long st) {
  memset(dp, 0, sizeof dp);
  dp[st][1 << st] = 1;
  for (long long i = 0; i < (1 << st + 1); i++) {
    for (long long j = 0; j <= st; j++) {
      if (!dp[j][i]) continue;
      if (i & (1 << j)) {
        if (g[j][st]) {
          ans += dp[j][i];
        }
        for (long long k = 0; k <= st; k++) {
          if (i & (1 << k)) continue;
          if (!g[j][k]) continue;
          dp[k][i | (1 << k)] += dp[j][i];
        }
      }
    }
  }
}
signed main() {
  cin >> n >> m;
  for (long long i = 1; i <= m; i++) {
    long long x, y;
    cin >> x >> y;
    x--;
    y--;
    g[x][y] = 1;
    g[y][x] = 1;
  }
  for (long long i = 0; i < n; i++) {
    calc(i);
    cerr << "ok calc" << i << endl;
  }
  cout << (ans - m) / 2 << endl;
  return 0;
}
