#include <bits/stdc++.h>
using namespace std;
template <class T>
using v2d = vector<vector<T> >;
template <class T>
bool uin(T &a, T b) {
  return a > b ? (a = b, true) : false;
}
template <class T>
bool uax(T &a, T b) {
  return a < b ? (a = b, true) : false;
}
mt19937 rng(chrono::system_clock::now().time_since_epoch().count());
const int maxN = 40 + 10;
int n, m, f[1 << 20], g[1 << 20], flag[maxN], mt[maxN];
vector<int> adj[maxN];
void sos(int h, int f[]) {
  for (int i = 0; i < (int)(h); ++i) {
    for (int mask = 0; mask < (int)(1 << h); ++mask) {
      if (mask >> i & 1) {
        f[mask] += f[mask ^ (1 << i)];
      }
    }
  }
}
void complement(int h, int f[]) {
  if (h == 0) {
    return;
  }
  int s = (1 << h) - 1;
  for (int mask = 0; mask < (int)(1 << (h - 1)); ++mask) {
    swap(f[mask], f[mask ^ s]);
  }
}
void dfs1(int u) {
  flag[u] = 1;
  for (auto &v : adj[u]) {
    if (flag[v] == 0) {
      dfs1(v);
    }
  }
}
bool dfs2(int u) {
  for (auto &v : adj[u]) {
    if (flag[v] == -1) {
      flag[v] = flag[u] ^ 1;
      if (!dfs2(v)) {
        return 0;
      }
    } else if (flag[v] == flag[u]) {
      return 0;
    }
  }
  return 1;
}
void solve() {
  cin >> n >> m;
  for (int i = 0; i < (int)(m); ++i) {
    int u, v;
    cin >> u >> v;
    u--;
    v--;
    adj[u].emplace_back(v);
    adj[v].emplace_back(u);
  }
  long long ans = 1LL << n;
  int n0 = n / 2;
  int n1 = n - n0;
  for (int i = 0; i < (int)(n0); ++i) {
    for (auto &j : adj[i]) {
      if (j < n0) {
        f[(1 << i) | (1 << j)] = 1;
      }
    }
  }
  sos(n0, f);
  for (int mask = 0; mask < (int)(1 << n0); ++mask) {
    if (f[mask] == 0) {
      f[mask] = 1;
    } else {
      f[mask] = 0;
    }
  }
  sos(n0, f);
  complement(n0, f);
  for (int i = (int)(n0); i <= (int)(n - 1); ++i) {
    for (auto &j : adj[i]) {
      if (j >= n0) {
        g[(1 << (i - n0)) | (1 << (j - n0))] = 1;
      } else {
        mt[i] |= 1 << j;
      }
    }
  }
  sos(n1, g);
  for (int mask = 0; mask < (int)(1 << n1); ++mask) {
    if (g[mask] == 0) {
      int s = 0;
      for (int i = 0; i < (int)(n1); ++i) {
        if (mask >> i & 1) {
          s |= mt[i + n0];
        }
      }
      ans -= f[s] * 2;
    }
  }
  int cc = 0;
  for (int i = 0; i < (int)(n); ++i) {
    if (flag[i] == 0) {
      cc++;
      dfs1(i);
    }
  }
  ans -= 1LL << cc;
  int isolated = 0;
  for (int i = 0; i < (int)(n); ++i) {
    isolated += adj[i].empty();
  }
  ans += 1LL << isolated;
  ans += 1LL << isolated;
  fill(flag, flag + n, -1);
  bool ok = 1;
  for (int i = 0; i < (int)(n); ++i) {
    if (flag[i] == -1) {
      flag[i] = 0;
      if (!dfs2(i)) {
        ok = 0;
        break;
      }
    }
  }
  if (ok) {
    ans += 1LL << cc;
  }
  if (m == 0) {
    ans -= 1LL << n;
  }
  cout << ans;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  int T = 1;
  while (T--) {
    solve();
  }
  return 0;
}
