#include <bits/stdc++.h>
using namespace std;
int vi[40], cl[40], ok, l, n, m;
long long e[40], va[1 << 22], a, c1, c2, r, c[40];
void dfs(int x) {
  vi[x] = 1;
  for (long long i = 0; i < n; i++)
    if (e[x] & (1ll << i)) {
      if (!vi[i]) {
        cl[i] = cl[x] ^ 1;
        dfs(i);
      } else if (cl[x] == cl[i])
        ok = 1;
    }
}
void g1(long long d, long long s) {
  if (d == l) {
    va[(~s) & a]++;
    return;
  }
  g1(d - 1, s);
  if (!(s & (1ll << d))) g1(d - 1, s | e[d]);
}
void g2(long long d, long long s, long long v) {
  if (d == l + 1) {
    r -= 2ll * va[v & a];
    return;
  }
  g2(d + 1, s, v);
  if (!(s & (1ll << d))) g2(d + 1, s | e[d], v + (1ll << d));
}
int main() {
  scanf("%d%d", &n, &m);
  if (!m) {
    puts("0");
    return 0;
  }
  for (int i = 0; i < n; i++) c[i] = 1;
  while (m--) {
    int x, y;
    scanf("%d%d", &x, &y);
    x--;
    y--;
    e[x] |= 1ll << y;
    e[y] |= 1ll << x;
    c[x] = c[y] = 0;
  }
  c1 = c2 = 1;
  for (int i = 0; i < n; i++)
    if (c[i]) c2 *= 2ll;
  for (int i = 0; i < n; i++)
    if (!vi[i]) {
      c1 *= 2ll;
      dfs(i);
    }
  l = (n - 1) / 2;
  a = (1 << (l + 1)) - 1;
  r = (1ll << n) - c1 + c2 * 2ll;
  if (!ok) r += c1;
  g1(n - 1, 0);
  for (int i = 1; i <= a; i <<= 1)
    for (int j = 0; j <= a; j += i << 1)
      for (int k = 0; k < i; k++) va[j + k] += va[i + j + k];
  g2(0, 0, 0);
  cout << r;
}
