#include <bits/stdc++.h>
using namespace std;
const int N = 45;
const int M = (1 << 20) + 5;
vector<int> G[N];
int used[N], color[N], rec[M], rec2[M];
queue<int> q;
queue<pair<int, long long> > q2;
void dfs(int x) {
  used[x] = 1;
  for (auto it : G[x]) {
    if (used[it]) continue;
    dfs(it);
  }
}
bool bipartite_checking(int x) {
  while (!q.empty()) q.pop();
  q.push(x);
  color[x] = 1;
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (auto it : G[u]) {
      if (color[it] == color[u]) return false;
      if (!color[it]) {
        color[it] = 3 - color[u];
        q.push(it);
      }
    }
  }
  return true;
}
int main() {
  int n, m, cnt, flag, half;
  long long ans, sum;
  scanf("%d %d", &n, &m);
  for (int i = 1, u, v; i <= m; i++) {
    scanf("%d %d", &u, &v);
    u--;
    v--;
    G[u].push_back(v);
    G[v].push_back(u);
  }
  ans = (1LL << n);
  if (!m) ans -= (1LL << n);
  cnt = 0;
  for (int i = 0; i < n; i++) {
    if (G[i].empty()) cnt++;
  }
  ans += (1LL << cnt) * 2;
  cnt = 0;
  for (int i = 0; i < n; i++) {
    if (!used[i]) {
      cnt++;
      dfs(i);
    }
  }
  ans -= (1LL << cnt);
  flag = 1;
  for (int i = 0; i < n; i++) {
    if (!color[i]) {
      if (!bipartite_checking(i)) {
        flag = 0;
        break;
      }
    }
  }
  if (flag) ans += (1LL << cnt);
  half = n / 2;
  rec[0] = 1;
  q2.push({0, 0});
  while (!q2.empty()) {
    int st = q2.front().first;
    long long st2 = q2.front().second;
    q2.pop();
    for (int i = 0; i < half; i++) {
      if (st2 & (1LL << i)) continue;
      if (rec[st ^ (1 << i)]) continue;
      long long temp = st2 | (1LL << i);
      for (auto it : G[i]) temp |= (1LL << it);
      rec[st ^ (1 << i)] = 1;
      q2.push({st ^ (1 << i), temp});
    }
  }
  for (int i = 0; i < half; i++) {
    for (int j = 0; j < (1 << half); j++) {
      if (j & (1 << i)) rec[j] += rec[j ^ (1 << i)];
    }
  }
  rec2[0] = 1;
  q2.push({0, 0});
  sum = 0;
  while (!q2.empty()) {
    int st = q2.front().first;
    long long st2 = q2.front().second;
    long long st3 = st2 ^ ((1LL << n) - 1);
    q2.pop();
    sum += rec[st3 & ((1LL << half) - 1)];
    for (int i = 0; i < n - half; i++) {
      if (st2 & (1LL << (i + half))) continue;
      if (rec2[st ^ (1 << i)]) continue;
      long long temp = st2 | (1LL << (i + half));
      for (auto it : G[i + half]) temp |= (1LL << it);
      rec2[st ^ (1 << i)] = 1;
      q2.push({st ^ (1 << i), temp});
    }
  }
  ans -= sum * 2;
  printf("%I64d\n", ans);
  return 0;
}
