#include <bits/stdc++.h>
using namespace std;
const long long MX = 30, mx = 6e5;
bool mat[MX][MX];
long long mask[mx][MX];
int32_t pl[mx];
vector<int32_t> vec[mx];
long long n, m, sum, t;
void pre() {
  for (long long i = 1; i < t; i++) {
    if (vec[i].size() < 3) continue;
    if (vec[i].size() == 3) {
      if (mat[vec[i][0]][vec[i][1]] && mat[vec[i][1]][vec[i][2]])
        mask[i][vec[i][2]] = 1;
      if (mat[vec[i][0]][vec[i][2]] && mat[vec[i][1]][vec[i][2]])
        mask[i][vec[i][1]] = 1;
      continue;
    }
    for (long long j = 1; j < vec[i].size(); j++) {
      long long v = vec[i][j];
      for (long long l = 1; l < vec[i].size(); l++) {
        long long u = vec[i][l];
        if (u == v || !mat[v][u]) continue;
        mask[i][v] += mask[i - pl[v]][u];
      }
    }
  }
}
int32_t main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  pl[0] = 1;
  for (long long i = 1; i < n; i++) {
    pl[i] = pl[i - 1] * 2;
  }
  t = pl[n - 1] * 2;
  for (long long i = 1; i < t; i++) {
    long long k = i;
    long long p = 0;
    while (k) {
      if (k % 2) vec[i].push_back(p);
      k /= 2;
      p++;
    }
  }
  for (long long i = 0; i < m; i++) {
    long long f, s;
    cin >> f >> s;
    mat[--f][--s] = 1;
    mat[s][f] = 1;
  }
  pre();
  for (long long i = 1; i < t; i++) {
    if (vec[i].size() < 3) continue;
    for (auto v : vec[i]) {
      if (mat[vec[i][0]][v]) sum += mask[i][v];
    }
  }
  cout << sum / 2;
  return 0;
}
