#include <bits/stdc++.h>
using namespace std;
int n;
long long dp[1 << 19][19];
int p[19];
int low[1000009];
bool vis[20][20];
int main() {
  int n, m, a, b;
  p[0] = 1;
  for (int i = 1; i < 19; ++i) {
    p[i] = 2 * p[i - 1];
    low[p[i]] = i;
  }
  scanf("%d%d", &n, &m);
  while (m--) {
    scanf("%d%d", &a, &b);
    vis[a - 1][b - 1] = vis[b - 1][a - 1] = true;
  }
  long long sol = 0;
  for (int q = n - 1; q > 0; q--) {
    int s = 1 << q;
    for (int i = 0; i < s; ++i) {
      for (int j = 0; j <= q; ++j) dp[i][j] = 0;
      if ((i & -i) == i)
        dp[i][low[i]] = vis[low[i]][q];
      else {
        int t = i;
        long long sel = 0;
        while (t) {
          int k = t & -t;
          int u = i ^ k;
          sel = 0;
          while (u) {
            int y = u & -u;
            if (vis[low[k]][low[y]]) sel += dp[i ^ k][low[y]];
            u ^= y;
          }
          t ^= k;
          dp[i][low[k]] = sel;
          if (vis[low[k]][q]) sol += dp[i][low[k]];
        }
      }
    }
  }
  printf("%I64d\n", sol / 2);
}
