#include <bits/stdc++.h>   using namespace std;   const int N = 40;   const int M = 20;   long long incident_mask[N];   vector<int> g[N];   int n, m, used[N];   long long ans = 0;   long long cntmask[1 << M];   template <typename T>   inline void chkmax(T &x, T y) {     x = max(x, y);   }   template <typename T>   inline void chkmin(T &x, T y) {     x = min(x, y);   }   template <typename T>   inline void read(T &x) {     T f = 1;     x = 0;     char c = getchar();     for (; !isdigit(c); c = getchar())       if (c ==  - ) f = -f;     for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c -  0 ;     x *= f;   }   inline long long binpow(long long a, long long n) {     long long res = 1;     for (; n; n >>= 1, a = (long long)a * a)       if (n & 1) res = (long long)res * a;     return res;   }   inline void dfs(int x, int c) {     if (used[x]) return;     used[x] = c;     for (int y : g[x]) dfs(y, 3 - c);   }   inline long long CountIsolated() {     long long ans = 0;     for (int i = 0; i < n; ++i)       if (g[i].empty()) ++ans;     return ans;   }   inline long long CountComponents() {     memset(used, 0, sizeof(used));     long long ans = 0;     for (int i = 0; i < n; ++i)       if (!used[i]) {         ++ans;         dfs(i, 1);       }     return ans;   }   inline bool bipartite() {     memset(used, 0, sizeof(used));     for (int i = 0; i < n; ++i)       if (!used[i]) dfs(i, 1);     for (int i = 0; i < n; ++i)       for (int j : g[i])         if (used[i] == used[j]) return false;     return true;   }   inline long long CountIndependentSets() {     int m1 = min(n, 20);     int m2 = n - m1;     memset(cntmask, 0, sizeof(cntmask));     for (int i = 0; i < (1 << m1); ++i) {       long long curmask = 0;       bool good = true;       for (int j = 0; j < m1; ++j) {         if ((i & (1 << j)) == 0) continue;         if (curmask & (1 << j)) good = false;         curmask |= ((1 << j) | incident_mask[j]);       }       if (good) ++cntmask[curmask >> m1];     }     for (int i = 0; i < m2; ++i)       for (int j = 0; j < (1 << m2); ++j)         if (j & (1 << i)) cntmask[j] += cntmask[j ^ (1 << i)];     long long ans = 0;     for (int i = 0; i < (1 << m2); i++) {       long long curmask = 0;       bool good = true;       for (int j = m1; j < n; j++) {         if ((i & (1 << (j - m1))) == 0) continue;         if (curmask & (1LL << j)) good = false;         curmask |= (1LL << j) | incident_mask[j];       }       if (good) ans += cntmask[(i ^ ((1 << m2) - 1))];     }     return ans;   }   inline long long calc(int mask) {     if (mask == 0) return binpow(2, n);     if (mask == 1 || mask == 4) return CountIndependentSets();     if (mask == 2) return binpow(2, CountComponents());     if (mask == 3 || mask == 6) return binpow(2, CountIsolated());     if (mask == 5) return (bipartite() ? binpow(2, CountComponents()) : 0);     if (mask == 7) return (m == 0 ? binpow(2, n) : 0);     return 0;   }   int main() {     read(n);     read(m);     for (int i = 0; i < m; ++i) {       int u, v;       read(u), read(v);       --u, --v;       g[u].emplace_back(v);       g[v].emplace_back(u);       incident_mask[u] ^= (1LL << v);       incident_mask[v] ^= (1LL << u);     }     long long ans = 0;     for (int i = 0; i < 8; ++i)       if (__builtin_popcount(i) % 2 == 0)         ans += calc(i);       else         ans -= calc(i);     printf( %lld n , ans);     return 0;   }