#include <bits/stdc++.h>
using namespace std;
const int MAXN = 60;
struct Edge {
  int next, to;
};
int n, m;
Edge e[MAXN << 7];
int tot, head[MAXN];
bool vis[MAXN];
long long cnt, ans = 1;
void Add_edge(int u, int v) {
  e[++tot].next = head[u];
  e[tot].to = v;
  head[u] = tot;
}
void dfs(int d) {
  vis[d] = 1;
  cnt *= 2;
  for (int i = head[d]; i; i = e[i].next) {
    int v = e[i].to;
    if (!vis[v]) dfs(v);
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    Add_edge(u, v);
    Add_edge(v, u);
  }
  for (int i = 1; i <= n; i++) {
    if (!vis[i]) {
      cnt = 1;
      dfs(i);
      cnt /= 2;
      ans *= cnt;
    }
  }
  printf("%lld\n", ans);
  return 0;
}
