#include <bits/stdc++.h>
const int maxn = 50;
const int maxm = maxn * maxn;
const int maxz = 1 << 21;
using namespace std;
int rd() {
  int x = 0, f = 1;
  char c = getchar();
  while (!isdigit(c)) {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (isdigit(c)) x = (x << 3) + (x << 1) + c - '0', c = getchar();
  return x * f;
}
int n, m, id[maxn], cnt1, cnt2, vis[maxn], col[maxn], lim, all;
int val[maxz];
bool flag = true;
long long ans, e[maxn];
void dfs(int u) {
  vis[u] = 1;
  for (int v = 0; v < n; v++)
    if (e[u] >> (1LL * v) & 1) {
      if (!vis[v])
        col[v] = col[u] ^ 1, dfs(v);
      else if (col[u] ^ col[v] ^ 1)
        flag = false;
    }
}
void dfs1(int dep, long long st, long long used) {
  if (dep == lim) {
    val[(~st) & (all - 1)]++;
    return;
  }
  dfs1(dep - 1, st, used);
  if (!((st >> dep) & 1)) dfs1(dep - 1, st | e[dep], used | 1 << dep);
}
void dfs2(int dep, long long st, long long used) {
  if (dep == lim + 1) {
    ans -= 2 * val[used & (all - 1)];
    return;
  }
  dfs2(dep + 1, st, used);
  if (!((st >> dep) & 1)) dfs2(dep + 1, st | e[dep], used | 1 << dep);
}
int main() {
  n = rd();
  m = rd();
  if (!m) {
    puts("0");
    return 0;
  }
  for (int i = 0; i < n; i++) id[i] = 1;
  for (int i = 1, u, v; i <= m; i++) {
    u = rd() - 1;
    v = rd() - 1;
    e[u] |= 1LL << v;
    e[v] |= 1LL << u;
    id[u] = id[v] = 0;
  }
  for (int i = 0; i < n; i++) cnt1 += id[i];
  for (int i = 0; i < n; i++)
    if (!vis[i]) cnt2++, dfs(i);
  ans = (1LL << n) - (1LL << cnt2) + (1LL << (cnt1 + 1)) +
        (flag ? 1LL << cnt2 : 0);
  lim = (n - 1) / 2;
  all = 1 << (lim + 1);
  dfs1(n - 1, 0, 0);
  for (int i = 1; i < all; i <<= 1)
    for (int j = 0; j < all; j += (i << 1))
      for (int k = 0; k < i; k++) val[j + k] += val[i + j + k];
  dfs2(0, 0, 0);
  printf("%lld\n", ans);
  return 0;
}
