#include <bits/stdc++.h>
using namespace std;
vector<int> vc[29];
int Set(int N, int pos) { return N = N | (1 << pos); }
int reset(int N, int pos) { return N = N & ~(1 << pos); }
bool check(int N, int pos) { return (bool)(N & (1 << pos)); }
long long dp[(1 << 19) + 5][20];
long long dp_func(int mask, int head, int par) {
  if (dp[mask][par] != -1) return dp[mask][par];
  long long ret = 0;
  for (int i = 0; i < vc[par].size(); i++) {
    int w = vc[par][i];
    if (w < head) continue;
    if (w == head && mask != (1 << par | 1 << head)) ret++;
    if (w != head && check(mask, w) == 0) ret += dp_func(Set(mask, w), head, w);
  }
  return dp[mask][par] = ret;
}
int main() {
  int i, j, k, l, m, n;
  cin >> n >> m;
  for (i = 0; i < m; i++) {
    cin >> k >> l;
    k--, l--;
    vc[k].push_back(l);
    vc[l].push_back(k);
  }
  memset(dp, -1, sizeof dp);
  long long ans = 0;
  memset(dp, -1, sizeof dp);
  for (i = 0; i < n; i++) {
    int musk = 0;
    ans += dp_func(Set(musk, i), i, i);
  }
  cout << ans / 2 << endl;
}
