#include <bits/stdc++.h>   #pragma warning(disable : 4996)   using namespace std;   using ld = long double;   template <class T>   using Table = vector<vector<T>>;   const ld eps = 1e-9;   template <class S, class T>   ostream &operator<<(ostream &os, const pair<S, T> v) {     os <<  (   << v.first <<  ,   << v.second <<  ) ;     return os;   }   template <class T>   ostream &operator<<(ostream &os, const vector<T> &v) {     for (int i = 0; i < v.size(); i++) {       if (i > 0) {         os <<    ;       }       os << v[i];     }     return os;   }   template <class T>   ostream &operator<<(ostream &os, const vector<vector<T>> &v) {     for (int i = 0; i < v.size(); i++) {       if (i > 0) {         os << endl;       }       os << v[i];     }     return os;   }   template <class T>   ostream &operator<<(ostream &os, const vector<set<T>> &v) {     for (int i = 0; i < v.size(); i++) {       if (i > 0) {         os << endl;       }       os << v[i];     }     return os;   }   template <class T>   ostream &operator<<(ostream &os, const set<T> &v) {     int i = 0;     for (auto it : v) {       if (i > 0) {         os <<    ;       }       os << it;       i++;     }     return os;   }   using ll = long long int;   pair<int, bool> get_c(const vector<vector<int>> &graph, int N) {     vector<int> comes(N);     vector<int> colors(N, -1);     bool ok = true;     queue<int> que;     int sum = 0;     for (int i = 0; i < N; ++i) {       if (!comes[i]) {         colors[i] = 0;         sum++;         que.emplace(i);         while (!que.empty()) {           int now = que.front();           comes[now] = true;           que.pop();           for (auto e : graph[now]) {             if (!comes[e]) {               que.emplace(e);               colors[e] = 1 ^ colors[now];             }             if (colors[e] == colors[now]) ok = false;           }         }       }     }     return make_pair(sum, ok);   }   ll int_pow(int a, int b) {     if (b == 0)       return 1;     else       return a * int_pow(a, b - 1);   }   int main() {     ios::sync_with_stdio(false);     int N, M;     cin >> N >> M;     vector<vector<int>> edges(N);     for (int i = 0; i < M; ++i) {       int u, v;       cin >> u >> v;       u--;       v--;       edges[u].push_back(v);       edges[v].push_back(u);     }     auto p = get_c(edges, N);     int C = p.first;     bool b_ok = p.second;     int isolated_v_cnt = 0;     for (int i = 0; i < N; ++i) {       if (edges[i].empty()) isolated_v_cnt++;     }     vector<vector<vector<ll>>> cnts(2, vector<vector<ll>>(2, vector<ll>(2)));     cnts[1][0][0] = cnts[0][0][1] = int_pow(2, isolated_v_cnt);     cnts[0][1][0] = b_ok ? int_pow(2, C) : 0;     cnts[1][1][1] = int_pow(2, N);     cnts[1][0][1] = int_pow(2, C);     {       int K = N / 2;       vector<int> yys(1ll << (N - K));       for (int xx = 0; xx < (1ll << K); ++xx) {         bool ok = true;         vector<int> uses(K);         for (int i = 0; i < K; ++i) {           uses[i] = (xx & (1ll << i)) != 0;         }         int yy = 0;         for (int i = 0; i < K; ++i) {           for (auto e : edges[i]) {             if (uses[i]) {               if (e < K) {                 if (uses[i] && uses[e]) ok = false;               } else {                 yy |= (1ll << (e - K));               }             }           }         }         if (ok) {           yys[yy ^ ((1ll << (N - K)) - 1)]++;         } else {         }       }       for (int i = 0; i < (N - K); ++i) {         for (int x = 0; x < (1ll << (N - K)); ++x) {           if ((x & (1ll << i)) != 0) {             yys[x ^ (1ll << i)] += yys[x];           }         }       }       ll answer = 0;       for (int yy = 0; yy < (1ll << (N - K)); ++yy) {         bool ok = true;         vector<int> uses(N - K);         for (int i = 0; i < N - K; ++i) {           uses[i] = (yy & (1ll << i)) != 0;         }         for (int i = 0; i < N - K; ++i) {           for (auto e : edges[K + i]) {             if (e >= K) {               if (uses[i] && uses[e - K]) ok = false;             } else {             }           }         }         if (ok) {           answer += yys[yy];         }       }       cnts[1][1][0] = cnts[0][1][1] = answer;     }     if (!M) cnts[0][0][0] = (1ll << N);     ll answer = 0;     answer = cnts[1][1][1] - cnts[1][1][0] - cnts[1][0][1] - cnts[0][1][1] +              cnts[1][0][0] + cnts[0][1][0] + cnts[0][0][1] - cnts[0][0][0];     cout << answer << endl;     return 0;   }