#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define For(i, a, b) for (i = a; i <= b; i++)
#define Tubtet(i, k) for (k = (i - 1) & i; k; k = (k - 1) & i)
#define Subset(i, k) for (k = i; k; k = (k - 1) & i)
using namespace std;
inline int read() {
    int res = 0; bool bo = 0; char c;
    while (((c = getchar()) < '0' || c > '9') && c != '-');
    if (c == '-') bo = 1; else res = c - 48;
    while ((c = getchar()) >= '0' && c <= '9')
        res = (res << 3) + (res << 1) + (c - 48);
    return bo ? ~res + 1 : res;
}
const int N = 17, M = 405, C = (1 << 15) + 5, PYZ = 1e9 + 7;
int n, m, g[N][N], f[3][C], c[C], d[C], Cm, p[M], ans;
int main() {
    int i, j, k, x, y; n = read(); m = read(); p[0] = 1;
    For (i, 1, m) x = read(), y = read(), g[x][y]++, p[i] = 2ll * p[i - 1] % PYZ;
    Cm = (1 << n) - 1; For (i, 0, Cm) For (j, 1, n) For (k, 1, n) if (g[j][k]) {
        if (((i >> j - 1) & 1) && ((i >> k - 1) & 1)) c[i] += g[j][k];
        if (((i >> j - 1) & 1) || ((i >> k - 1) & 1)) d[i] += g[j][k];
    }
    For (k, 1, 2) For (i, 0, Cm) {
            if (!((i >> k - 1) & 1)) continue; f[k][i] = p[c[i]]; Tubtet(i, j) {
                if (!((j >> k - 1) & 1)) continue;
                f[k][i] = (f[k][i] - 1ll * f[k][j] * p[c[i - j]] % PYZ + PYZ) % PYZ;
            }
        }
    ans = p[m]; For (i, 0, Cm) {
        if (!(i & 1) || ((i >> 1) & 1)) continue; Subset(Cm - i, j) {
            if (!((j >> 1) & 1) || c[i] + c[j] < c[i + j]) continue;
            ans = (ans - 1ll * f[1][i] * f[2][j] % PYZ *
                p[m - d[i + j]] % PYZ + PYZ) % PYZ;
        }
    }
    cout << ans << endl; return 0;
}