#include <bits/stdc++.h>
using namespace std;
const long long N = 2e6 + 10;
long long n, m, x, y, eg[N], v[N], as, fg = 1, cl[N], cnt, f[N], c, d, nn, hn,
                                       cnt2;
long long D(long long e) {
  long long fg1 = 1;
  v[e] = 1;
  for (long long i = (1); i <= (n); i++)
    if ((eg[e] >> i - 1) & 1)
      if (v[i])
        fg1 &= (cl[i] != cl[e]);
      else
        cl[i] = cl[e] ^ 1, fg1 &= D(i);
  return fg1;
}
signed main() {
  scanf("%lld%lld", &n, &m);
  nn = n;
  for (long long i = (1); i <= (m); i++)
    scanf("%lld%lld", &x, &y), eg[x] |= 1ll << (y - 1), eg[y] |= 1ll << (x - 1);
  for (long long i = (1); i <= (n); i++)
    if (!eg[i]) ++cnt2;
  if (m) ++cnt2;
  for (long long i = (1); i <= (n); i++)
    if (!v[i]) fg &= D(i), ++cnt;
  as = (1ll << n) - (1ll << cnt) + (1ll << cnt2) + fg * (1ll << cnt);
  n /= 2;
  hn = nn - n;
  for (long long i = (0); i <= ((1ll << n) - 1); i++) {
    c = d = 0;
    for (long long j = (1); j <= (n); j++)
      if ((i >> j - 1) & 1) c |= 1ll << j - 1, d |= eg[j];
    if (!(c & d)) f[i] = 1;
  }
  for (long long j = (1); j <= (n); j++)
    for (long long i = (0); i <= ((1ll << n) - 1); i++)
      if ((i >> j - 1) & 1) f[i] += f[i - (1ll << j - 1)];
  for (long long i = (0); i <= ((1ll << hn) - 1); i++) {
    c = d = 0;
    for (long long j = (1); j <= (hn); j++)
      if ((i >> j - 1) & 1) c |= 1ll << j + n - 1, d |= eg[j + n];
    if (!(c & d)) as -= 2 * f[(1ll << n) - 1 - d % (1ll << n)];
  }
  printf("%lld\n", as);
  return 0;
}
