#include <bits/stdc++.h>
using namespace std;
const int N = 40;
vector<int> g[N];
bitset<N> visit;
bitset<N> color;
int n, m;
long long incidence[N];
long long dp[(1 << (N >> 1))];
long long fpow(long long x, long long y) {
  long long res = 1;
  while (y) {
    if (y & 1 == true) res = res * x;
    x = x * x;
    y >>= 1;
  }
  return res;
}
void dfs(int u) {
  visit[u] = 1;
  for (auto v : g[u]) {
    if (visit[v] == 0) {
      dfs(v);
    }
  }
}
int components() {
  visit.reset();
  int cnt = 0;
  for (int u = 0; u < n; ++u) {
    if (visit[u] == 0) {
      dfs(u);
      ++cnt;
    }
  }
  return cnt;
}
int isolated() {
  int cnt = 0;
  for (int u = 0; u < n; ++u) {
    if (g[u].size() == 0) ++cnt;
  }
  return cnt;
}
void dfs2(int u, bool col) {
  visit[u] = true;
  color[u] = col;
  for (auto v : g[u]) {
    if (visit[v] == 0) {
      dfs2(v, !col);
    }
  }
}
bool isBipartite() {
  visit.reset();
  color.reset();
  for (int u = 0; u < n; ++u) {
    if (visit[u] == false) {
      dfs2(u, 0);
    }
  }
  for (int u = 0; u < n; ++u) {
    for (auto v : g[u]) {
      if (color[u] == color[v]) return false;
    }
  }
  return true;
}
long long independent() {
  memset(dp, 0, sizeof dp);
  int s1 = min(n, 20);
  int s2 = n - s1;
  for (int i = 0; i < (1 << s1); ++i) {
    long long mask = 0;
    bool yes = true;
    for (int j = 0; j < s1; ++j) {
      if (i & (1LL << j)) {
        if (mask & (1LL << j)) yes = false;
        mask |= ((1LL << j) | incidence[j]);
      }
    }
    if (yes) {
      ++dp[(mask >> s1)];
    }
  }
  for (int i = 0; i < s2; ++i) {
    for (int j = 0; j < (1 << s2); ++j) {
      if (j & (1 << i)) dp[j] += dp[j ^ (1 << i)];
    }
  }
  long long count = 0;
  for (int i = 0; i < (1 << s2); ++i) {
    long long mask = 0;
    bool yes = true;
    for (int j = s1; j < n; ++j) {
      int b = j - s1;
      if (i & (1 << b)) {
        if (mask & (1LL << j)) yes = false;
        mask |= ((1LL << j) | incidence[j]);
      }
    }
    if (yes) {
      count += dp[i ^ ((1LL << s2) - 1)];
    }
  }
  return count;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> n >> m;
  int tm = m;
  while (m--) {
    int u, v;
    cin >> u >> v;
    --u;
    --v;
    g[u].emplace_back(v);
    g[v].emplace_back(u);
    incidence[u] |= (1LL << v);
    incidence[v] |= (1LL << u);
  }
  long long cc = fpow(2, components());
  long long iso = fpow(2, isolated());
  long long ind = independent();
  long long v = fpow(2, n);
  bool bi = isBipartite();
  long long ans =
      v - (ind << 1) - cc + (iso << 1) + (bi ? cc : 0) - (tm ? 0 : v);
  cout << ans << '\n';
}
