#include<bits/stdc++.h>
using namespace std;
#define siz(x) (int)(x).size()
#define int long long
typedef pair<int,int> Pii;
const int N=5e5+5,M=1e6+5,Mod=1e9+7;
struct Edge{
    int u,v;
}e[M];
int pw[N];
int n,m;
int ans;
int fa[N],sz[N];
inline int find(int x)
{
    if(x==fa[x])return x;
    return fa[x]=find(fa[x]);
}
bool use[N];
inline void calc()
{
    iota(fa+1,fa+n+1,1);
    for(int i=1;i<=n;i++)sz[i]=1;
    for(int i=1;i<=m;i++)
    {
        if(use[i])continue;
        int u=e[i].u,v=e[i].v;
        int fx=find(u),fy=find(v);
        if(fx==fy)continue;
        fa[fx]=fy,sz[fy]+=sz[fx];
    }
    // for(int i=1;i<=n;i++)
    //     if(find(i)==i)cout<<sz[i]<<' ';
    //     else cout<<0<<' ';
    // cout<<'\n';
    for(int i=1;i<=n;i++)
        if(find(i)==i)
            (ans+=pw[sz[i]]-1)%=Mod;
}

inline void dfs(int dep)
{
    if(dep==m+1)return calc(),void ();
    use[dep]=1,dfs(dep+1),use[dep]=0;
    dfs(dep+1);
}

signed main()
{
    freopen("barrack.in","r",stdin);
    freopen("barrack.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>m;
    pw[0]=1;
    for(int i=1;i<=n;i++)pw[i]=pw[i-1]*2%Mod;
    for(int i=1;i<=m;i++)cin>>e[i].u>>e[i].v;
    dfs(1);cout<<ans<<'\n';
    return 0;
}