#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
long long n,m,cnt,last[25],x,y,ans,dp[600005][25];
struct edge{
int v,next;
}e[1005];
inline void add(int u,int v)
{
e[++cnt].v=v;
e[cnt].next=last[u];
last[u]=cnt;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>x>>y;
add(x-1,y-1);
add(y-1,x-1);
}
for(int i=0;i<n;i++)
dp[1<<i][i]=1;
for(int i=1;i<(1<<n);i++)
for(int j=0;j<n;j++)
{
if(!dp[i][j]) continue;
for(int k=last[j];k;k=e[k].next)
{
int v=e[k].v;
if((i&-i)>(1<<(v)))
continue;
if(i&(1<<v))
{
if((i&(-i))==(1<<v))
ans+=dp[i][j];
}
else
dp[i|(1<<v)][v]+=dp[i][j];
}
}
ans=(ans-m)/2;
cout<<ans;
return 0;
}