#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int inf = 0x3f3f3f3f;
const int maxn = 1e5 + 5;
const int mod = 1e9 + 7;
int n, na, nb, m;
bool g[45][45];
int s1[20], s2[20], s12[20];
int cnt3[1 << 20];
int getType(int s[], int i, int N) {
  int k = 0;
  for (int j = 0; j < N; j++) {
    if (s[j] == 0) continue;
    int t = s[j] & i;
    if ((1 << j) & i) {
      if (t == 0)
        k |= 2;
      else
        return 4;
    } else {
      if (t == 0)
        k |= 1;
      else if (t == s[j])
        k |= 2;
      else
        k |= 3;
    }
  }
  return k;
}
int getState(int i) {
  int ret = 0;
  for (int j = 0; j < na; j++) {
    if ((1 << j) & i) ret |= s12[j];
  }
  return ret;
}
ll solve() {
  for (int i = 0; i < (1 << nb); i++) {
    int k = getType(s2, i, nb);
    if (k > 3) continue;
    cnt3[i]++;
  }
  for (int i = 0; i < nb; i++)
    for (int j = 0; j < (1 << nb); j++) {
      if (j & (1 << i)) cnt3[j] += cnt3[j - (1 << i)];
    }
  ll ans = 0;
  int N = (1 << nb) - 1;
  for (int S = 0; S < (1 << na); S++) {
    int k = getType(s1, S, na);
    if (k > 3) continue;
    int A = getState(S);
    ans += cnt3[N ^ A];
  }
  return ans;
}
int vis[45], bg = true;
int dfs(int u) {
  int ret = 1;
  for (int i = 0; i < n; i++) {
    if (!g[u][i]) continue;
    if (vis[i] != -1) {
      if (vis[i] == vis[u]) bg = false;
    } else {
      vis[i] = vis[u] ^ 1;
      ret += dfs(i);
    }
  }
  return ret;
}
int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> m;
  if (n < 4 || m <= 3) {
    cout << 0 << "\n";
    return 0;
  }
  nb = n / 2;
  na = n - nb;
  while (m--) {
    int u, v;
    cin >> u >> v;
    u--;
    v--;
    g[u][v] = g[v][u] = true;
  }
  for (int i = 0; i < na; i++) {
    for (int j = 0; j < na; j++)
      if (g[nb + i][nb + j]) s1[i] |= (1 << j);
  }
  for (int i = 0; i < nb; i++) {
    for (int j = 0; j < nb; j++)
      if (g[i][j]) s2[i] |= (1 << j);
  }
  for (int i = 0; i < na; i++) {
    for (int j = 0; j < nb; j++)
      if (g[nb + i][j]) s12[i] |= (1 << j);
  }
  memset(vis, -1, sizeof vis);
  int I = 0, C = 0;
  for (int i = 0; i < n; i++) {
    if (vis[i] == -1) {
      C++;
      vis[i] = 0;
      I += (dfs(i) == 1);
    }
  }
  cout << (1LL << n) - 2 * solve() - (1LL << C) + 2 * (1LL << I) +
              ((bg) ? (1LL << C) : 0)
       << "\n";
  return 0;
}
