#include <bits/stdc++.h>
using namespace std;
int n, p, u, b;
vector<int> v[45];
int f[45];
int sos[2000000];
pair<int, int> fst[1600], scd[1600], both[1600];
void dfs_bipartite(int nod, int &ok) {
  int i, vecin;
  for (i = 0; i < v[nod].size(); i++) {
    vecin = v[nod][i];
    if (!f[vecin]) {
      f[vecin] = -f[nod];
      dfs_bipartite(vecin, ok);
    } else if (f[vecin] == f[nod])
      ok = 0;
  }
}
long long cazgreu() {
  int i;
  long long check, mask, sol = 0;
  for (mask = 0; mask < ((long long)1 << (n / 2)); mask++) {
    for (i = 1; i <= p; i++) {
      if ((mask & ((long long)1 << (fst[i].first - 1))) &&
          (mask & ((long long)1 << (fst[i].second - 1)))) {
        break;
      }
    }
    if (i > p) {
      sos[mask]++;
    }
  }
  for (i = 0; i < n / 2; i++) {
    for (mask = 0; mask < ((long long)1 << (n / 2)); mask++) {
      if (mask & ((long long)1 << i))
        sos[mask] += sos[mask ^ ((long long)1 << i)];
    }
  }
  for (mask = 0; mask < ((long long)1 << (n / 2 + n % 2)); mask++) {
    for (i = 1; i <= u; i++) {
      if ((mask & ((long long)1 << (scd[i].first - n / 2 - 1))) &&
          (mask & ((long long)1 << (scd[i].second - n / 2 - 1)))) {
        break;
      }
    }
    if (i > u) {
      check = ((long long)1 << (n / 2)) - 1;
      for (i = 1; i <= b; i++) {
        if ((mask & ((long long)1 << (both[i].second - n / 2 - 1)))) {
          if ((check & ((long long)1 << (both[i].first - 1))))
            check = (check ^ ((long long)1 << (both[i].first - 1)));
        }
      }
      sol += sos[check];
    }
  }
  return sol;
}
int main() {
  FILE *fin = stdin;
  FILE *fout = stdout;
  int m, i, aa, bb, cc1, cc, ok;
  long long sol, d0, d1;
  fscanf(fin, "%d%d", &n, &m);
  if (m == 0) {
    fprintf(fout, "0");
    return 0;
  }
  b = p = u = 0;
  for (i = 1; i <= m; i++) {
    fscanf(fin, "%d%d", &aa, &bb);
    v[aa].push_back(bb);
    v[bb].push_back(aa);
    if (aa > bb) swap(aa, bb);
    if (aa <= n / 2 && bb > n / 2)
      both[++b] = make_pair(aa, bb);
    else if (aa <= n / 2 && bb <= n / 2)
      fst[++p] = make_pair(aa, bb);
    else
      scd[++u] = make_pair(aa, bb);
  }
  sol = ((long long)1 << n);
  cc1 = 0;
  d0 = 0;
  for (i = 1; i <= n; i++) {
    if (v[i].empty()) cc1++;
  }
  d0 = ((long long)1 << cc1);
  ok = 1;
  cc = 0;
  d1 = 0;
  for (i = 1; i <= n; i++) {
    if (!f[i]) {
      cc++;
      f[i] = 1;
      dfs_bipartite(i, ok);
    }
  }
  if (ok) {
    sol = sol - ((long long)1 << cc);
    d1 = ((long long)1 << cc);
  }
  sol = sol - ((long long)1 << cc);
  sol = sol + 2 * (d0 + d1);
  sol = sol - 2 * cazgreu();
  fprintf(fout, "%lld", sol);
  return 0;
}
