#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 41;
const int MASK = 1 << 21;
long long sz[MAX_N], par[MAX_N], po2[MAX_N], vis[MAX_N];
long long dp[MASK];
vector<int> adj[MAX_N];
int rt(int v) { return v ^ par[v] ? par[v] = rt(par[v]) : v; }
void join(int u, int v) {
  if ((u = rt(u)) != (v = rt(v))) {
    par[v] = u, sz[u] += sz[v];
  }
}
int main() {
  int n, m;
  cin >> n >> m;
  if (m < 3) {
    cout << 0 << endl;
    return 0;
  }
  po2[0] = 1;
  for (int i = 0; i < n; i++) par[i] = i, sz[i] = 1;
  for (int i = 1; i < n + 1; i++) po2[i] = po2[i - 1] * 2ll;
  long long ans = po2[n];
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    a--, b--;
    join(a, b);
    adj[a].push_back(b);
    adj[b].push_back(a);
  }
  set<long long> s;
  long long num = 0;
  for (int i = 0; i < n; i++) {
    s.insert(rt(i));
    if (sz[rt(i)] == 1) num++;
  }
  ans += po2[num + 1] - po2[s.size()];
  bool imposs = false;
  for (int i = 0; i < n; i++) {
    if (vis[i]) continue;
    queue<pair<int, int> > q;
    q.push({i, 1});
    while (q.size()) {
      pair<int, int> curr = q.front();
      q.pop();
      if (vis[curr.first]) {
        if (vis[curr.first] != curr.second) {
          imposs = true;
          break;
        } else
          continue;
      }
      vis[curr.first] = curr.second;
      for (int next : adj[curr.first]) q.push({next, curr.second ^ 3});
    }
    if (imposs) break;
  }
  if (!imposs) ans += po2[s.size()];
  num = 0;
  for (int mask = 0; mask < 1 << ((n + 1) / 2); mask++) {
    bool nowork = false;
    long long new_mask = (1 << (n / 2)) - 1;
    for (int k = 0; k < (n + 1) / 2; k++) {
      if (!(mask & (1 << k))) continue;
      for (int nxt : adj[2 * k]) {
        if (nxt & 1)
          new_mask &= (1 << (n / 2)) - (1 << (nxt / 2)) - 1;
        else
          nowork = nowork || (mask & (1 << (nxt / 2)));
      }
    }
    if (!nowork) dp[new_mask]++;
  }
  for (int i = 0; i < n / 2; i++)
    for (int mask = 0; mask < 1 << (n / 2); mask++)
      if (mask != (mask | (1 << i))) dp[mask] += dp[mask | (1 << i)];
  for (int mask = 0; mask < 1 << (n / 2); mask++) {
    bool nowork = false;
    for (int k = 0; k < n / 2; k++) {
      if (!(mask & (1 << k))) continue;
      for (long long nxt : adj[2 * k + 1]) {
        if (nxt & 1 && mask & (1 << (nxt / 2))) nowork = true;
      }
    }
    if (!nowork) num += dp[mask];
  }
  ans -= 2ll * num;
  cout << ans << endl;
}
