#include <bits/stdc++.h>
using namespace std;
const int N = 40;
const int M = 20;
long long incident_mask[N];
vector<int> g[N];
int n, m, used[N];
long long ans = 0;
long long cntmask[1 << M];
template <typename T>
inline void chkmax(T &x, T y) {
  x = max(x, y);
}
template <typename T>
inline void chkmin(T &x, T y) {
  x = min(x, y);
}
template <typename T>
inline void read(T &x) {
  T f = 1;
  x = 0;
  char c = getchar();
  for (; !isdigit(c); c = getchar())
    if (c == '-') f = -f;
  for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - '0';
  x *= f;
}
inline long long binpow(long long a, long long n) {
  long long res = 1;
  for (; n; n >>= 1, a = (long long)a * a)
    if (n & 1) res = (long long)res * a;
  return res;
}
inline void dfs(int x, int c) {
  if (used[x]) return;
  used[x] = c;
  for (int y : g[x]) dfs(y, 3 - c);
}
inline long long CountIsolated() {
  long long ans = 0;
  for (int i = 0; i < n; ++i)
    if (g[i].empty()) ++ans;
  return ans;
}
inline long long CountComponents() {
  memset(used, 0, sizeof(used));
  long long ans = 0;
  for (int i = 0; i < n; ++i)
    if (!used[i]) {
      ++ans;
      dfs(i, 1);
    }
  return ans;
}
inline bool bipartite() {
  memset(used, 0, sizeof(used));
  for (int i = 0; i < n; ++i)
    if (!used[i]) dfs(i, 1);
  for (int i = 0; i < n; ++i)
    for (int j : g[i])
      if (used[i] == used[j]) return false;
  return true;
}
inline long long CountIndependentSets() {
  int m1 = min(n, 20);
  int m2 = n - m1;
  memset(cntmask, 0, sizeof(cntmask));
  for (int i = 0; i < (1 << m1); ++i) {
    long long curmask = 0;
    bool good = true;
    for (int j = 0; j < m1; ++j) {
      if ((i & (1 << j)) == 0) continue;
      if (curmask & (1 << j)) good = false;
      curmask |= ((1 << j) | incident_mask[j]);
    }
    if (good) ++cntmask[curmask >> m1];
  }
  for (int i = 0; i < m2; ++i)
    for (int j = 0; j < (1 << m2); ++j)
      if (j & (1 << i)) cntmask[j] += cntmask[j ^ (1 << i)];
  long long ans = 0;
  for (int i = 0; i < (1 << m2); i++) {
    long long curmask = 0;
    bool good = true;
    for (int j = m1; j < n; j++) {
      if ((i & (1 << (j - m1))) == 0) continue;
      if (curmask & (1LL << j)) good = false;
      curmask |= (1LL << j) | incident_mask[j];
    }
    if (good) ans += cntmask[(i ^ ((1 << m2) - 1))];
  }
  return ans;
}
inline long long calc(int mask) {
  if (mask == 0) return binpow(2, n);
  if (mask == 1 || mask == 4) return CountIndependentSets();
  if (mask == 2) return binpow(2, CountComponents());
  if (mask == 3 || mask == 6) return binpow(2, CountIsolated());
  if (mask == 5) return (bipartite() ? binpow(2, CountComponents()) : 0);
  if (mask == 7) return (m == 0 ? binpow(2, n) : 0);
  return 0;
}
int main() {
  read(n);
  read(m);
  for (int i = 0; i < m; ++i) {
    int u, v;
    read(u), read(v);
    --u, --v;
    g[u].emplace_back(v);
    g[v].emplace_back(u);
    incident_mask[u] ^= (1LL << v);
    incident_mask[v] ^= (1LL << u);
  }
  long long ans = 0;
  for (int i = 0; i < 8; ++i)
    if (__builtin_popcount(i) % 2 == 0)
      ans += calc(i);
    else
      ans -= calc(i);
  printf("%lld\n", ans);
  return 0;
}
