#include <bits/stdc++.h>
using namespace std;
const int N = 44;
int n, m, vis[N], is_ind1[1 << 20];
long long gg[N], C, I, D, odd, adj[1 << 20], dp[1 << 20];
vector<int> G[N];
void calCIodd() {
  memset(vis, -1, sizeof(vis));
  auto bfs = [&](int st) {
    int num = 0;
    queue<int> q;
    q.push(st);
    vis[st] = 0;
    while (!q.empty()) {
      int u = q.front();
      q.pop();
      ++num;
      for (int v : G[u]) {
        if (vis[v] == -1)
          q.push(v), vis[v] = (vis[u] ^ 1);
        else if (vis[v] != (vis[u] ^ 1))
          odd = 1;
      }
    }
    return num;
  };
  C = 0, I = 0, odd = 0;
  for (int i = (1); i <= (n); ++i)
    if (vis[i] == -1) I += (bfs(i) == 1), ++C;
}
void pt(int S, int n) {
  for (int i = 0; i < n; ++i) {
    cout << ((S >> i) & 1);
  }
  cout << endl;
}
long long ind_set() {
  long long ans = 0;
  int hf = n / 2;
  for (int S = 0; S < (1 << hf); ++S) {
    int flag = 1;
    for (int i = 0; i < hf; ++i)
      if ((S >> i) & 1) {
        adj[S] |= (gg[i] >> hf);
        if (S & (gg[i] & ((1 << hf) - 1))) flag = 0;
      }
    is_ind1[S] = flag;
  }
  for (int S = 0; S < (1 << (n - hf)); ++S) {
    int flag = 1;
    for (int i = 0; i < n - hf; ++i)
      if ((S >> i) & 1) {
        if (S & (gg[i + hf] >> hf)) flag = 0;
      }
    dp[S] = flag;
  }
  for (int j = 0; j < n - hf; ++j)
    for (int i = 0; i < (1 << (n - hf)); ++i)
      if (i & (1 << j)) dp[i] += dp[i ^ (1 << j)];
  int M = (1 << (n - hf)) - 1;
  for (int S = 0; S < (1 << hf); ++S)
    if (is_ind1[S]) {
      ans += dp[M ^ adj[S]];
    }
  return ans;
}
int main() {
  cin >> n >> m;
  for (int i = (1); i <= (m); ++i) {
    int u, v;
    cin >> u >> v;
    G[u].push_back(v), G[v].push_back(u);
    --u, --v;
    gg[u] |= 1ll << v;
    gg[v] |= 1ll << u;
  }
  calCIodd();
  D = ind_set();
  long long ans = 0;
  ans += 1ll << n;
  ans -= 1ll << C;
  ans -= D;
  ans -= D;
  ans += 1ll << I;
  ans += 1ll << I;
  if (!odd) ans += 1ll << C;
  if (!m) ans -= 1ll << n;
  cout << ans << '\n';
}
