#include <bits/stdc++.h>
using namespace std;
const int N = 41;
int n, m, x, y, k, b[N], matris[N][N], dp[(1 << 20)], check[(1 << 20)], n1,
    mj[22][(1 << 20)], mark[N], dis[N];
vector<int> g[N];
long long ans = 0, cmp1, cmp2, p;
void solve1(int mask) {
  long long av = -1, p = 0;
  for (long long i = 0; i < n1; i++) {
    if (mask % (1 << (i + 1)) >= (1 << i)) {
      if (av == -1)
        av = i + 1;
      else if (matris[i + 1][av] == 0)
        p += (1 << i);
    }
  }
  dp[mask] = dp[mask - (1 << (av - 1))] + dp[p];
}
void chk(int mask) {
  int c = 0, mn = 44;
  for (long long i = 0; i < n - n1; i++) {
    if (mask % (1 << (i + 1)) >= (1 << i)) {
      b[c] = n1 + i + 1;
      c++;
      mn = min(mn, check[mask - (1 << i)]);
      ;
    }
  }
  if (c != 2 && mn == 1) check[mask] = 1;
  if (c == 2 && matris[b[0]][b[1]] == 0) check[mask] = 1;
}
long long mojaver(int x, int mask) {
  if (mj[x][mask] >= 0) return mj[x][mask];
  if (mask == 0) {
    mj[x][mask] = 1;
    return 1;
  }
  for (long long i = 0; i < n - n1; i++) {
    if (mask % (1 << (i + 1)) >= (1 << i)) {
      mj[x][mask] = (matris[x][n1 + i + 1] == 0 && mojaver(x, mask - (1 << i)));
      return mj[x][mask];
    }
  }
}
void solve2(long long mask) {
  long long p = 0;
  for (long long i = 1; i < n1 + 1; i++)
    if (mojaver(i, mask)) p += (1 << (i - 1));
  ans = ans - dp[p] - dp[p];
}
void check_biparti_graph(long long x, long long dist, long long par) {
  mark[x] = 1;
  dis[x] = dist;
  for (long long i = 0; i < g[x].size(); i++) {
    if (mark[g[x][i]] && g[x][i] != par && dis[g[x][i]] % 2 == dis[x] % 2)
      k = 0;
  }
  for (long long i = 0; i < g[x].size(); i++)
    if (mark[g[x][i]] == 0) check_biparti_graph(g[x][i], dist + 1, x);
}
int main() {
  dp[0] = check[0] = 1;
  scanf("%d%d", &n, &m);
  ;
  if (m <= 1) return cout << 0, 0;
  for (long long i = 0; i < m; i++) {
    scanf("%d%d", &x, &y);
    ;
    g[x].push_back(y);
    g[y].push_back(x);
    matris[x][y] = 1;
    matris[y][x] = 1;
  }
  n1 = n / 2;
  for (long long i = 0; i < 22; i++)
    for (long long j = 0; j < (1 << 20); j++) mj[i][j] = -1;
  for (long long i = 1; i < (1 << n1); i++) solve1(i);
  for (long long i = 1; i < (1 << n - n1); i++) chk(i);
  ans = (1ll << 1ll * n);
  for (long long i = 0; i < (1 << n - n1); i++) {
    if (check[i]) solve2(i);
  }
  p = cmp1 = cmp2 = 1;
  for (long long i = 1; i < n + 1; i++) {
    if (!mark[i]) {
      k = 1;
      check_biparti_graph(i, 0, 0);
      if (g[i].size())
        cmp1 *= 2;
      else
        cmp2 *= 2;
      if (k)
        p = p * 2;
      else
        p = 0;
    }
  }
  ans = ans + p - (cmp1 - 2) * cmp2;
  cout << ans << endl;
}
