#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define mod 1000000007
#define F first
#define S second
#define all(v) (v).begin(),(v).end()
#define np next_permutation
#define lp(i,n) for(int i=0;i<n;i++)
#define lps(i,j,n) for(int i=j;i<n;i++)
#define vii vector<vi>
#define vb vector<bool>
#define pr pair<int,int>
#define vl vector<ll>
#define vs vector<string>
#define us unordered_map<int,int>
#define Mpq priority_queue<int>
#define mpq priority_queue<int,vi,greater<int>> 
#define eb emplace_back
#define pr pair<int,int>
#define prl pair<ll,ll>
#define vp vector<pr>
#define vpl vector<prl>
#define mkp make_pair
#define ld long double
#define vii vector<vi>
#define Max(a,b) a=max(a,b)
#define Min(a,b) a=min(a,b)
#define ull unsigned long long
#define prr pair<ll,int>

// #include <ext/pb_ds/tree_policy.hpp> 
// #include <ext/pb_ds/assoc_container.hpp>

// using namespace __gnu_pbds;
using namespace std;
using vi=vector<int>;

// typedef  tree<prl, null_type,less<prl>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
// ordered_set s;

#define F_OR(i, a, b, s) for (int i=(a); (s)>0?i<(b):i>(b); i+=(s))
#define F_OR1(e) F_OR(i, 0, e, 1)
#define F_OR2(i, e) F_OR(i, 0, e, 1)
#define F_OR3(i, b, e) F_OR(i, b, e, 1)
#define F_OR4(i, b, e, s) F_OR(i, b, e, s)
#define GET5(a, b, c, d, e, ...) e
#define F_ORC(...) GET5(__VA_ARGS__, F_OR4, F_OR3, F_OR2, F_OR1)
#define FOR(...) F_ORC(__VA_ARGS__)(__VA_ARGS__)
#define EACH(x, a) for (auto& x: a)
template<class T> using pqg = priority_queue<T,vector<T>,greater<T>>;

double epsilon=(double)1e-9;
const int N=(int)1e6+12;
int t;

const ll MX=(ll)1e18+123;
const int inf=0x3fffffff;

vi g[21];
vi par,color;
vb vis;

void dfs(int u){
   vis[u]=1;
   par.eb(u);
   for(auto &v:g[u]){
      if(!vis[v]) dfs(v);
   }
}

ll cal(int i){
   if(i==(int)par.size()){
      return 1;
   }
   int u=par[i];
   ll ans=0;
   lp(c,3){
      color[u]=c;
      bool valid=1;
      for(int v:g[u]){
         if(color[u]==color[v]){
            valid=0;
            break;
         }
      }
      if(valid) ans+=cal(i+1);
      color[u]=-1;
   }
   return ans;
}

void solve(){
   int n,m,u,v;
   ll ans=1;
   cin>>n>>m;
   vis.resize(n);
   color.resize(n,-1);

   lp(i,m){
      cin>>u>>v;
      u--,v--;
      g[u].eb(v);
      g[v].eb(u);
   }

   lp(i,n){
      if(vis[i]) continue;
      par.resize(0);
      dfs(i);
      color[i]=0;
      ans*=3*cal(1);
      // color[i]=-1;
   }
   cout<<ans<<"\n";
}

int main(){
   ios_base::sync_with_stdio(0);  
   cin.tie(nullptr);

   solve(); 
   return 0;
}

#include <bits/stdc++.h>
#define ll long long
#define ls (v << 1)
#define rs ((v << 1)|1)
#define ll long long
#define free fajeiof
#define right fjewiofjaewoi
#define move afjoiejwioaf
int gcd(int a, int b){
    if (a == 0)
        return b;
    return gcd(b % a, a);
}
using namespace std;
 
const int nmax = 300001;
const int inf = 1e9 + 7;
const int mod = 998244353;
 
 
int tt, timer;
int n, m, color[nmax], cur, x, y;
bool used[nmax];
vector<int> g[nmax], comp;

void dfs1(int v){
    comp.push_back(v);
    used[v] = true;
    for (int to: g[v]){
        if (!used[to])
            dfs1(to);
    }
}

bool check(int v, int col){
    for (int to : g[v]){
        if (color[to] == col)
            return false;
    }
    return true;
}

void dfs2(int idx){
    
    //cout << idx << " vert: " << endl;
    if (idx == comp.size()){
        cur++;
        return;
    }
    int v = comp[idx];
    for (int c = 1; c <= 3; c++){
        if (!check(v, c))
            continue;
        color[v] = c;
        dfs2(idx + 1);
    }
    color[v] = -1;
}

void solve(){
    cin >> n >> m;
    while (m--){
        cin >> x >> y;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    ll ans = 1;
    for (int i = 1; i <= n; i++){
        if (!used[i]){
            comp.clear();
            dfs1(i);
            cur = 0;
            dfs2(0);
            ans *= cur;
        }
    }
    cout << ans << endl;
}
 
 
int main()
{
	srand(time(0));
	std::ios::sync_with_stdio(false);
    
    //cin >> tt;
    tt = 1;
	while (tt--){
	    solve();
	}
	
	
	return 0;
}

