// Complexity (Estimated): 2 ^ n * n * (n + m)
#define PROBLEM "barrack"
#ifndef EVIL_X8E0R2O9N8
#include <fstream>
std::ifstream Xin(PROBLEM ".in");
std::ofstream Xout(PROBLEM ".out");
#else
#define Xin cin
#define Xout cout
#endif
#include <iostream>
#include <vector>
using namespace std;
typedef signed long long s64; // Signed 64-bit integer.
constexpr s64 Modulo = 1000000007;
struct Edge {
	int Destination;
	int Id;
};
vector<Edge> Graph[50];
bool Visited[50];
bool IsEssential[2000000];
bool IsBarrack[50];
int TraversalId[50];
int TraverseMarker = 0;

struct Status {
	bool BarrackExists;
	int ReturnId;
};

// (Tarjan) Find the essential edges and mark them.
Status MarkEssential(int current, int previous = -1) {
	bool barrackExists = IsBarrack[current];
	if (Visited[current]) {
		return { barrackExists, min(TraversalId[current], TraversalId[previous]) };
	}
	int myId = TraversalId[current] = TraverseMarker++;
	int returnMin = 0x7FFFFFFF;
	Visited[current] = true;
	for (const Edge& e : Graph[current]) {
		if (e.Destination != previous) {
			Status s = MarkEssential(e.Destination, current);
			if (s.ReturnId > myId && s.BarrackExists) { IsEssential[e.Id] = true; }
			if (returnMin > s.ReturnId) { returnMin = s.ReturnId; }
			barrackExists |= barrackExists;
		}
	}
	return { barrackExists, returnMin };
}
int main() {
	int n, m;
	Xin >> n >> m;
	if (n >= 20) { throw; } // A looser limit.
	for (int i = 0; i < m; i++) {
		int u, v;
		Xin >> u >> v;
		u--;
		v--;
		Graph[u].push_back({ v, i });
		Graph[v].push_back({ u, i });
	}
	s64 answer = 0;
	for (int i = 1, e = 1 << n; i < e; i++) { // Enumerate.
		for (int x = 0; x < n; x++) {
			if (i & (1 << x)) { IsBarrack[x] = true; }
			else { IsBarrack[x] = false; }
		}
		for (int x = 0; x < n; x++) {
			if (i & (1 << x)) { 
				for (int j = 0; j < n; j++) { Visited[j] = false; }
				TraverseMarker = 0;
				MarkEssential(x);
			}
		}
		int optional = 0;
		for (int j = 0; j < m; j++) {
			if (!IsEssential[j]) { optional++; }
			IsEssential[j] = false;
		}
		s64 result = 1;
		for (int i = 0; i < optional; i++) { result = (result << 1) % Modulo; }
		answer += result;
	}
	Xout << (answer % Modulo) << endl;
}