#include <bits/stdc++.h>
using namespace std;
const int N = 45;
int n;
vector<int> graph[N];
long long total = 1;
bool ok = 0, edge[N][N];
int cnt = 0;
long long num[3], Case[3][3], dp[(1 << 20)];
bool vis[N], color[N];
void dfs(int u, bool co) {
  color[u] = co;
  cnt++;
  vis[u] = 1;
  for (int i = 0; i < (int)(graph[u].size()); i++) {
    int v = graph[u][i];
    if (!vis[v])
      dfs(v, 1 - co);
    else {
      if (color[v] != 1 - co) ok = 1;
    }
  }
}
bool checkBit(int mask, int bit) {
  if ((mask & (1 << bit)))
    return 1;
  else
    return 0;
}
int changeBit(int mask, int bit) { return (mask ^ (1 << bit)); }
void Calc(int type) {
  memset(dp, 0, sizeof(dp));
  int m = n - (n / 2 + 1) + 1;
  int l = n / 2 + 1;
  for (int mask = 0; mask < (1 << m); mask++) {
    bool uk = 0;
    for (int bit = 0; bit < m; bit++) {
      if (checkBit(mask, bit) == type) {
        for (int nxbit = 0; nxbit < bit; nxbit++) {
          if (edge[l + bit][l + nxbit] && checkBit(mask, nxbit) == type) uk = 1;
        }
      }
    }
    if (uk) continue;
    dp[mask]++;
  }
  for (int bit = 0; bit < m; bit++) {
    for (int mask = 0; mask < (1 << m); mask++) {
      if (checkBit(mask, bit) == type) dp[mask] += dp[changeBit(mask, bit)];
    }
  }
  int sz = m;
  m = (n / 2) - 1 + 1;
  for (int mask = 0; mask < (1 << m); mask++) {
    bool uk = 0;
    int nmask = (1 << sz) - 1;
    for (int bit = 0; bit < m; bit++) {
      if (checkBit(mask, bit) == type) {
        for (int nxbit = 0; nxbit < bit; nxbit++) {
          if (edge[1 + bit][1 + nxbit] && checkBit(mask, nxbit) == type) uk = 1;
        }
        for (int nxbit = 0; nxbit < sz; nxbit++) {
          if (edge[1 + bit][l + nxbit] && checkBit(nmask, nxbit) == type)
            nmask = changeBit(nmask, nxbit);
        }
      }
    }
    if (uk) continue;
    Case[type - 1][type] += dp[nmask];
  }
}
int main() {
  cin.tie(0), ios_base::sync_with_stdio(0);
  int Edge;
  cin >> n >> Edge;
  for (int i = 1; i <= Edge; i++) {
    int u, v;
    cin >> u >> v;
    graph[u].push_back(v);
    graph[v].push_back(u);
    edge[u][v] = edge[v][u] = 1;
  }
  if (Edge <= 2) {
    cout << "0";
    exit(0);
  }
  Case[0][2] = num[0] = num[1] = num[2] = 1;
  for (int i = 1; i <= n; i++) total *= 2ll;
  for (int i = 1; i <= n; i++) {
    if (!vis[i]) {
      ok = 0;
      cnt = 0;
      dfs(i, 0);
      Case[0][2] *= 2;
      if (ok)
        num[1] *= 0;
      else
        num[1] *= 2;
      if (cnt == 1) {
        num[0] *= 2;
        num[2] *= 2;
      }
    }
  }
  Case[0][2] -= num[0];
  Case[0][2] -= num[2];
  total -= Case[0][2];
  for (int i = 0; i < 3; i++) total -= num[i];
  Calc(1);
  total -= Case[0][1];
  total += num[0];
  total += num[1];
  total -= Case[0][1];
  total += num[1];
  total += num[2];
  cout << total;
}
