#include <bits/stdc++.h>
using namespace std;
const int N = 1200005;
int n, m, v[55], p[55], M, f[N];
bool g[55][55];
long long ans, all;
inline bool Can(int S, int ad) {
  for (int i = 0; i < M; i++)
    for (int j = i + 1; j < M; j++)
      if (g[i + ad][j + ad] && ((1 << i) & S) && ((1 << j) & S)) return 0;
  return 1;
}
inline void Get1() {
  for (int s = 0; s < (1 << M); s++)
    if (Can(s, 0)) f[s]++;
}
inline void maintain() {
  for (int i = 0; i < M; i++)
    for (int j = 0; j < (1 << M); j++)
      if (!((1 << i) & j)) f[j | (1 << i)] += f[j];
}
inline long long Get2() {
  long long an = 0;
  for (int s = 0, now, al = (1 << M) - 1; s < (1 << (n - M)); s++)
    if (Can(s, M)) {
      now = 0;
      for (int i = M; i < n; i++)
        if ((1 << (i - M)) & s)
          for (int j = 0; j < M; j++)
            if (g[i][j]) now |= 1 << j;
      an += f[al ^ now];
    }
  return an;
}
inline long long solve1() {
  Get1();
  maintain();
  return Get2();
}
int getfa(int x) { return p[x] == x ? x : (p[x] = getfa(p[x])); }
inline long long solve2() {
  long long an = 1;
  for (int i = 0; i < n; i++) p[i] = i;
  for (int i = 0, fa, fb; i < n; i++)
    for (int j = i + 1; j < n; j++)
      if (g[i][j]) {
        fa = getfa(i), fb = getfa(j);
        if (fa != fb) p[fa] = fb;
      }
  for (int i = 0; i < n; i++)
    if (v[getfa(i)] != 2) v[p[i]] = 2, an <<= 1;
  return an;
}
inline long long solve3() {
  long long an = 1;
  for (int i = 0; i < n; i++)
    for (int j = i + 1; j < n; j++)
      if (g[i][j]) v[i] = v[j] = 3;
  for (int i = 0; i < n; i++)
    if (v[i] != 3) an <<= 1;
  return an;
}
bool color(int x, int c) {
  v[x] = c;
  for (int i = 0; i < n; i++)
    if (g[x][i])
      if (v[i] == v[x])
        return 0;
      else if (v[i] < 4 && !color(i, 9 - c))
        return 0;
  return 1;
}
inline long long solve4() {
  long long an = 1;
  for (int i = 0; i < n; i++)
    if (v[i] < 4)
      if (!color(i, 4))
        return 0;
      else
        an <<= 1;
  return an;
}
int main() {
  scanf("%d%d", &n, &m), all = (1ll << n) - 1, M = n + 1 >> 1;
  if (!m) ans -= all + 1;
  for (int U, V; m; m--) scanf("%d%d", &U, &V), U--, V--, g[V][U] = g[U][V] = 1;
  ans += all + 1;
  ans -= 2 * solve1();
  ans -= solve2();
  ans += 2 * solve3();
  ans += solve4();
  cout << ans << endl;
  return 0;
}
