#include <bits/stdc++.h>
using namespace std;
int N, M;
bool G[19][19];
unsigned long long dp[1 << 19][19], res;
unsigned long long solve() {
  for (int v = 0; v < N; v++) {
    dp[1 << v][v] = 1;
  }
  for (int b = 0; b < (1 << N); b++) {
    if (__builtin_popcount(b) > 1) {
      for (int first = 0; first < N; first++) {
        if ((b >> first) & 1) {
          for (int v = first + 1; v < N; v++) {
            if ((b >> v) & 1) {
              for (int u = first; u < N; u++) {
                if (v != u && (b >> u) & 1 && G[u][v]) {
                  dp[b][v] += dp[b ^ (1 << v)][u];
                }
              }
            }
            if (__builtin_popcount(b) > 2 && G[first][v]) {
              res += dp[b][v];
            }
          }
          break;
        }
      }
    }
  }
  return res / 2;
}
int main() {
  cin >> N >> M;
  for (int i = 0; i < M; i++) {
    int v, u;
    cin >> v >> u;
    v--;
    u--;
    G[v][u] = G[u][v] = 1;
  }
  cout << solve() << endl;
}
