#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using P = pair<int,int>;
#define rep(i, n) for(int i = 0; i < n; i++)

int n,m;
vector<int> G[20];
bool used[20];
int col[20];
vector<int> vs;

void dfs(int v)
{
    if(used[v])return;
    used[v]=true;
    vs.push_back(v);
    for(int u:G[v])dfs(u);
}

ll now;
void dfs2(int i)
{
    if(i==vs.size()){
        now++;
        return;
    }
    int v = vs[i];
    rep(c,3){
        col[v] = c;
        bool ok = true;
        for(int u:G[v]){
            if(col[u]==c)ok=false;
        }
        if(!ok)continue;
        dfs2(i+1);
    }
    col[v]=-1;
}
int main()
{
    cin >> n >> m;
    rep(i,m){
        int a,b;
        cin >> a >> b;
        a--;b--;
        G[a].push_back(b);
        G[b].push_back(a);
    }
    ll ans = 1;
    memset(col,-1,sizeof(col));
    rep(i,n){
        if(used[i])continue;
        ans*=3;
        vs = vector<int>();
        dfs(i);
        col[vs[0]]=0;
        now=0;
        dfs2(1);
        ans*=now;
    }
    cout << ans << endl;
    return 0;
}
//----------BHAVIK DIWANI(PICT_COMP)---------------
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define test ll t; cin>>t; while(t--)
#define fastio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define mod 1000000007
#define ll long long
#define int long long
#define ull unsigned long long
#define MAX 1000005
#define pb push_back
#define mkp make_pair
#define vi vector<int>
#define pii pair<int,int>
#define endl '\n'
#define vs vector<string>
#define mii map<int,int>
#define msi map<string,int>
#define vpii vector< pair<int, int > >
#define vpsi vector< pair< string ,int > >
#define forci(p,q) for(int i=p;i<q;i++)
#define rep(i,n) for(int i=0;i<n;i++)
ll gcd(ll a,ll b){ if(b==0) return a;    return gcd(b,a%b);}
ll lcm(ll a,ll b) { return (a/gcd(a,b)*b);}
ull power(ull a, ull b) {a %= mod;  ull res = 1;  while (b > 0) { if (b & 1) res = res * a % mod;  a = a * a % mod;  b >>= 1; }  return res%mod; }
ll modmul(ll x, ll y){return (x*y)%mod;}
ll modadd(ll x, ll y){return (x+y)%mod;}
ll modsub(ll x, ll y){return (x-y+mod)%mod;}
ll fact[1000007]={0};
void facto() {fact[0]=1;fact[1]=1;for(int i=2;i<1000007;i++)fact[i]=(fact[i-1]*i)%mod;}
ll ncr(ll n,ll r) {ll res=1; res=fact[n]; res=(res*(power(fact[r],mod-2)))%mod; res=(res*(power(fact[n-r],mod-2)))%mod; return res;}
ll npr(ll n,ll r) {ll res=1; res=fact[n]; res=(res*(power(fact[n-r],mod-2)))%mod; return res;}
inline long long toint(const std::string &s) {std::stringstream ss; ss << s; long long x; ss >> x; return x;}
inline std::string tostring(long long number) {std::stringstream ss; ss << number; return ss.str();}
inline std::string tobin(long long x) {return std::bitset<63>(x).to_string();}
const int inf=1e9;
/*bool prime[MAX];
ull sieve(){memset(prime,true,sizeof(prime));for(ull p=2;p*p<MAX;p++){if(prime[p]==true){for(ull i=2*p;i<MAX;i+=p){prime[i]=false;}}}prime[0]=0;prime[1]=0;
}*/
/*
int inv[1000001]={0};int invf[1000001]={0};
void findinverse(){
	inv[0]=1;
	inv[1] = 1;
	for(int i = 2; i <=1e6 ; ++i)
		inv[i] = (mod - (mod/i) * inv[mod%i] % mod) % mod;
	invf[0]=1;invf[1]=1;
	for(int i=2;i<=1e6;i++){
		invf[i]=invf[i-1]*inv[i]%mod;
	}
}*/
using namespace std;
const int N=25;
int n,m;
vi adj[N];
vector<bool>vis(N,false);
vi g,color;
void dfs(int s){
	vis[s]=true;
	for(auto i:adj[s]){
		if(!vis[i])
			dfs(i);
	}
	g.pb(s);
}
int cnt(int idx){
	if(idx==g.size())
		return 1;
	int s=g[idx];
	int res=0;
	for(int c=0;c<3;c++){
		bool ok=true;
		for(auto i:adj[s]){
			if(c==color[i])
				ok=false;
		}
		if(ok){
			color[s]=c;
			res+=cnt(idx+1);
			color[s]=-1;
		}
	}
	return res;
}
int solve()
{
	bool flag=true;
	cin>>n>>m;
	color.resize(n+1,-1);
	for(int i=0;i<m;i++){
		int x,y;
		cin>>x>>y;
		adj[x].pb(y);
		adj[y].pb(x);
	}
	int sum=1LL;
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			g.clear();
			dfs(i);
			reverse(g.begin(),g.end());
			int ans=cnt(0);
			sum*=ans;
		}
	}
	cout<<sum<<endl;
	return 0;
}
signed main()
{
	fastio;
//	test
		solve();
}