#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
long long dp[1 << 19][19];
vector<int> s[55];
int Log[1 << 20];
int v[55][55];
int main(void) {
  srand(time(0));
  cout << fixed << setprecision(7);
  cerr << fixed << setprecision(7);
  int n, m;
  cin >> n >> m;
  for (int qwerty = 1; qwerty <= m; ++qwerty) {
    int a, b;
    cin >> a >> b;
    --a;
    --b;
    v[a][b] = v[b][a] = 1;
    s[a].push_back(b);
    s[b].push_back(a);
  }
  for (int i = 2; i <= 1e6; ++i) Log[i] = Log[i / 2] + 1;
  for (int i = 0; i < n; ++i) dp[1 << i][i] = 1;
  for (int mask = 1; mask < (1 << n); ++mask)
    if (__builtin_popcount(mask) > 1) {
      for (int i = 0; i < n; ++i)
        if (((mask >> i) & 1) && i != Log[mask & (-mask)])
          for (auto it : s[i])
            if ((mask >> it) & 1) dp[mask][i] += dp[mask ^ (1 << i)][it];
    }
  long long ans = 0;
  for (int mask = 1; mask < (1 << n); ++mask)
    for (int i = 0; i < n; ++i)
      if (__builtin_popcount(mask) >= 3 && (((mask >> i) & 1)) &&
          v[Log[mask & (-mask)]][i])
        ans += dp[mask][i];
  ans /= 2;
  cout << ans << '\n';
  return 0;
}
