#include <bits/stdc++.h>
using namespace std;
int n, m;
long long ans = 0;
const int maxn = 20;
int G[maxn][maxn];
long long dp[1 << maxn][maxn];
int lowbit(int a) { return a & (-a); }
int main() {
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    G[a - 1][b - 1] = 1;
    G[b - 1][a - 1] = 1;
  }
  for (int i = 0; i < n; i++) {
    dp[1 << i][i] = 1;
  }
  for (int mask = 1; mask < (1 << n); mask++) {
    for (int ed = 0; ed < n; ed++) {
      if (!dp[mask][ed]) {
        continue;
      }
      for (int nxt = 0; nxt < n; nxt++) {
        if (!G[ed][nxt]) {
          continue;
        }
        if (lowbit(mask) > (1 << nxt)) {
          continue;
        }
        if (mask & (1 << nxt)) {
          if (lowbit(mask) == (1 << nxt)) {
            ans += dp[mask][ed];
          }
        } else {
          dp[mask | (1 << nxt)][nxt] += dp[mask][ed];
        }
      }
    }
  }
  long long cnt = (ans - m) / 2;
  cout << cnt << endl;
  return 0;
}
