#include <bits/stdc++.h>
using namespace std;
enum { N = 42, M = 1000, L = 1 << 20 };
int n, m, S[L], eA[N], eB[N], C[N], Z[N], V[N];
int fi(int u) {
  if (u == C[u]) return u;
  int f = C[u];
  C[u] = fi(f);
  V[u] ^= V[f];
  return C[u];
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; ++i) C[i] = i, Z[i] = 1;
  if (m < 3) puts("0"), exit(0);
  int a = n / 2, b = n - a, k = 0, l = 0, g = 0;
  for (int i = 1; i <= m; ++i) {
    int x, y;
    scanf("%d%d", &x, &y);
    {
      int a = fi(x), b = fi(y);
      if (a == b) {
        if (V[x] == V[y]) g = 1;
      } else {
        C[a] = b, Z[b] += Z[a], V[a] = V[x] ^ V[y] ^ 1;
      }
    }
    --x, --y;
    if (x < a)
      eA[y] |= 1 << x;
    else
      eB[y] |= 1 << (x - a);
    if (y < a)
      eA[x] |= 1 << y;
    else
      eB[x] |= 1 << (y - a);
  }
  for (int i = 1; i <= n; ++i)
    if (fi(i) == i) {
      ++k;
      if (Z[i] == 1) ++l;
    }
  for (int i = 0; i <= (1 << a) - 1; ++i) {
    int o = 1;
    for (int j = 0; j <= a - 1; ++j)
      if ((i >> j & 1) && (eA[j] & i)) {
        o = 0;
        break;
      }
    if (o) ++S[i];
  }
  for (int i = 0; i <= a - 1; ++i)
    for (int j = 0; j <= (1 << a) - 1; ++j)
      if (j & 1 << i) S[j] += S[j ^ 1 << i];
  long long f = 0;
  for (int i = 0; i <= (1 << b) - 1; ++i) {
    int o = 1;
    for (int j = 0; j <= b - 1; ++j)
      if ((i >> j & 1) && (eB[a + j] & i)) {
        o = 0;
        break;
      }
    if (o) {
      int e = 0;
      for (int j = 0; j <= b - 1; ++j)
        if (i >> j & 1) e |= eA[a + j];
      f += S[((1 << a) - 1) ^ e];
    }
  }
  long long ans = (1LL << n) - f - f - (1LL << k) + (1LL << l) + (1LL << l) +
                  (g ? 0 : (1LL << k));
  printf("%lld\n", ans);
  return 0;
}
