#include <bits/stdc++.h>
using namespace std;
const int N = 20, M = 30, mod = 1e9+7;
int n,m,u[M],v[M],vis[N],cut[M],c[N],far[N],must[N];
struct edge{int to,id;};
vector<edge> edg[N];
vector<int> tr[N];

void dfs(int u,int ct) {
    vis[u] = 1;
    for (int i = 0; i < edg[u].size(); ++i) {
        int v = edg[u][i].to, id = edg[u][i].id;
        if (id == ct || vis[v]) continue;
        dfs(v,ct);
    }
}

void DFS(int u,int col) {
    c[u] = col;
    for (int i = 0; i < edg[u].size(); ++i) {
        int v = edg[u][i].to, id = edg[u][i].id;
        if (cut[id] == 0 && c[v] == 0) DFS(v,col);
    }
}

void prp(int u,int fa) {
    for (int i = 0; i < tr[u].size(); ++i) {
        int v = tr[u][i];
        if (v == fa) continue;
        far[v] = u;
        prp(v,u);
    }
}

int main() {
    freopen("barrack.in","r",stdin);
    freopen("barrack.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (int i = 1; i <= m; ++i) {
        scanf("%d%d",&u[i],&v[i]);
        edg[u[i]].push_back(edge{v[i],i});
        edg[v[i]].push_back(edge{u[i],i});
    }

    for (int i = 1; i <= m; ++i) {
        memset(vis,0,sizeof(vis));
        dfs(u[i],i);
        for (int j = 1; j <= n; ++j) if (!vis[j]) cut[i] = 1;
    }

    // for (int i = 1; i <=n; ++i) {
    //     if (cut[i]) cout << u[i] << " " << v[i] << " ?" << endl;
    // }

    int cur = 0;
    memset(c,0,sizeof(c));
    for (int i = 1; i <= n; ++i) {
        if (!c[i]) DFS(i,++cur);
    }
    // for (int i = 1; i <= n; ++i) cout << c[i] << " ";
    // cout << " !" << endl;

    for (int u = 1; u <= n; ++u) {
        for (int i = 0; i < edg[u].size(); ++i) {
            int v = edg[u][i].to, id = edg[u][i].id;
            if (cut[id]) {
                tr[c[u]].push_back(c[v]);
                tr[c[v]].push_back(c[u]);
            }
        }       
    }

    int ans = 0;
    for (int S = 1; S < (1<<n); ++S) {
        int root;
        for (int i = 0; i < n; ++i) if (S>>i&1) {
            root = c[i+1];
            break;
        }
        prp(root,0);
        memset(must,0,sizeof(must));
        for (int i = 0; i < n; ++i) if (S>>i&1) {
            int u = c[i+1];
            while (u != root) {
                must[u] = 1;
                u = far[u];
            }
        }

        int cnt = 0;
        for (int i = 1; i <= cur; ++i) if (must[i] == 1) cnt++;
        // cout << S << " -> " << cnt << endl;
        ans += (1<<(m-cnt));
        ans %= mod;
    }

    cout << ans << endl;

    return 0;
}