#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int dis[40];
long long adj[40];
vector<long long> v1;
vector<long long> v2;
void bt(int l, int r, long long mask) {
  if (l == r) {
    v1.emplace_back(mask);
    return;
  }
  bt(l + 1, r, mask);
  if (adj[l] & mask) return;
  bt(l + 1, r, mask | (1ll << l));
}
long long f[1 << 21];
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin >> n;
  int m;
  cin >> m;
  long long ans = 1;
  for (int i = 0; i < n; ++i) ans *= 2;
  for (int i = 0; i < m; ++i) {
    int x;
    cin >> x;
    --x;
    int y;
    cin >> y;
    --y;
    adj[x] |= (1ll << y);
    adj[y] |= (1ll << x);
  }
  long long cnt1 = 1;
  long long cnt01 = 1;
  long long cnt02 = 1;
  for (int j = 0; j < n; ++j)
    if (adj[j] == 0) cnt01 *= 2;
  fill(dis, dis + n, -1);
  for (int i = 0; i < n; ++i)
    if (dis[i] < 0) {
      cnt1 *= 2;
      cnt02 *= 2;
      int S = 0;
      queue<int> qu;
      qu.push(i);
      dis[i] = 0;
      while (qu.size()) {
        int u = qu.front();
        qu.pop();
        S++;
        for (int v = 0; v < n; ++v)
          if (adj[u] >> v & 1) {
            if (dis[v] < 0) dis[v] = dis[u] ^ 1, qu.push(v);
            if (dis[v] == dis[u]) cnt02 = 0;
          }
      }
    }
  if (ans == cnt1) ans = 0;
  ans -= cnt1;
  ans += cnt01 * 2;
  ans += cnt02;
  m = n / 2;
  bt(m, n, 0);
  v1.swap(v2);
  bt(0, m, 0);
  for (long long x : v2) {
    int M = 0;
    for (int i = 0; i < m; ++i) {
      if (adj[i] & x)
        continue;
      else
        M |= (1 << i);
    }
    f[M]++;
  }
  for (int i = 0; i < m; ++i)
    for (int j = 0; j < (1 << m); ++j)
      if (j >> i & 1) f[j ^ (1 << i)] += f[j];
  for (long long x : v1) ans -= f[x], ans -= f[x];
  cout << ans << endl;
}
