#include <bits/stdc++.h> 
#define fp( i , x , y ) for( int i=(x); i<=(y); ++i ) 
#define fq( i , x , y ) for( int i=(y); i>=(x); --i ) 
using namespace std ; 
const int N = 5e5+10 , mod = 1e9+7 ;  
int a[N] , pre[N] , pw[N] , n , m , ans ;  
struct node { int x , y ; } e[N] ;   
vector <int> v[N] ; 
int f( int x ) { return pre[x] == x ? x : pre[x] = f(pre[x]) ; }
void sol() { 
  int cnt = 0 ; 
  fp( i , 1 , m ) { 
    fp( j , 1 , n ) pre[j] = j ; 
    fp( j , 1 , m ) { 
      if( i == j ) continue ; 
      pre[f(e[j].x)] = f(e[j].y) ; 
	} 
	int p = -1 ; 
	fp( j , 1 , n ) { 
	  if( !a[j] ) continue ; 
	  if( p == -1 ) p = f(j) ; 
	  if( p != f(j) ) { cnt ++ ; break ; }  
	} 
  } 
 // cout << "C : " << '\n' ; 
 // fp( i , 1 , n ) cout << a[i] << ' ' ; cout << '\n' ; 
 // cout << cnt << '\n' ; 
  ans += pw[m-cnt] ;
  ans %= mod ;  
} 
void M( int d ) { 
  if( d == n+1 ) { 
    sol() ; 
    return ; 
  } 
  a[d] = 0 ; M( d+1 ) ; 
  a[d] = 1 ; M( d+1 ) ; 
} 
signed main() { 
  freopen( "barrack.in" , "r" , stdin ) ; 
  freopen( "barrack.out" , "w" , stdout ) ; 
  ios::sync_with_stdio(false) ; 
  cin.tie(0) ; 
  int x , y ; 
  cin >> n >> m ; 
  pw[0] = 1 ; 
  fp( i , 1 , m ) pw[i] = 2 * pw[i-1] % mod ; 
  fp( i , 1 , m ) cin >> e[i].x >> e[i].y ; 
  M( 1 ) ; 
  ans = ( ans + mod - pw[m] ) % mod ; 
  cout << ans << '\n' ; 
  return 0 ; 
} 
