#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

vector<bool> consumed;
vector<set<int>> v;

void dfs(int i) {

    consumed[i] = true;
    for(auto e : v[i]) {
        if(!consumed[e])
            dfs(e);
    }
}

#ifndef _LOCAL
int main() {
    int n, m;
    cin >> n >> m;
    vector<ll> a(m), b(m);
    for(int i = 0; i < m; i++)
        cin >> a[i] >> b[i];

    for(int i = 0; i < m; i++) {
        a[i]--;
        b[i]--;
    }
    v = vector<set<int>>(n, set<int>());
    for(int i = 0; i < m; i++) {
        v[a[i]].insert(b[i]);
    }
    ll ans = 0ll;
    for(int i = 0; i < n; i++) {
        consumed = vector<bool>(n, false);
        dfs(i);
        for(int j = 0; j < n; j++)
            if(consumed[j])
                ans++;
        /*
        cout << i << " -> ";
        for(int j = 0; j < n; j++)
            if(consumed[j])
                cout << j << " ";
        cout << endl;
        */
    }
    cout << ans << endl;
    return 0;
}
#endif
/* これを翻訳している間、あなたはあなたの人生のいくつかの貴重な瞬間を無駄にしました */

#include <bits/stdc++.h>
using namespace std;

#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long
#define pb push_back
#define fi first
#define se second
#define all(x) (x).begin(),(x).end()
#define S(x) (int)(x).size()
#define L(x) (int)(x).length()
#define ld long double
#define mem(x,y) memset(x,y,sizeof x)

#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
typedef tree<int , null_type , less<int> , rb_tree_tag , tree_order_statistics_node_update> ordered_set;

const int mod = 1e9+7;
const ll infl = 0x3f3f3f3f3f3f3f3fLL;
const int infi = 0x3f3f3f3f;

bool vis[30];
vector<int> ord;
int adj[30][30];
int choice[30];

void dfs(int v)
{
	vis[v]=1;
	ord.pb(v);
	
	for(int i=1;i<=20;i++)
	{
		if(adj[v][i]==1 && !vis[i]) dfs(i);
	}
}

ll f(int ind, int c)
{
	if(ind == S(ord)-1) return 1;
	choice[ord[ind]]=c;
	set<int> nxt={1,2,3};
	for(int i=0;i<=ind;i++)
	if(adj[ord[i]][ord[ind+1]]==1) nxt.erase(choice[ord[i]]);
	ll ret=0;
	for(auto u:nxt) ret += f(ind+1,u);
	return ret;
}

int main()
{
	IOS
	int n,m;
	cin>>n>>m;
	for(int i=0;i<m;i++)
	{
		int a,b;
		cin>>a>>b;
		adj[a][b]=adj[b][a]=1;
	}
	ll ans=1;
	
	for(int i=1;i<=n;i++)
	{
		if(!vis[i])
		{
			dfs(i);
			ans *= (f(0,1)+f(0,2)+f(0,3));
			ord.clear();
		}
	}
	cout<<ans<<'\n';
}
