rt,瞪不出来
#include<bits/stdc++.h>
#define ll long long
const ll N=20;
const ll M=600001;
ll n,m,u,v,w,ans;
ll edge[N][N],f[M][N];
using namespace std;
ll res(ll x){
ll ans=0;
while(x){
x>>=1;
ans++;
}
return ans;
}
void put(ll i,ll j,ll k){
cout<<"( ";
while(i){
cout<<res(i&-i)<<' ';
i-=(i&-i);
}
cout<<") ";
cout<<j+1<<' '<<k+1<<' '<<f[i][j]<<endl;
}
int main(){
cin>>n>>m;
memset(edge,0x3f,sizeof edge);
for(ll i=1;i<=m;i++){
cin>>u>>v;
u--,v--;
edge[u][v]=1;
edge[v][u]=1;
}
for(ll i=0;i<n;i++)
f[1<<i][i]=1;
for(ll i=1;i<=(1<<n);i++){
for(ll j=0;j<n;j++){
if(!f[i][j]) continue;
for(ll k=0;k<n;k++){
if(!edge[j][k]) continue;
if((i&-i)>1<<k) continue;
if(1<<k&i){
if(1<<k==(i&-i))
ans+=f[i][j];
}
else{
f[i|(1<<k)][k]+=f[i][j];
}
//put(i,j,k);
}
}
}
cout<<(ans-m)/2;
return 0;
}
/*
4 6
1 2
1 3
1 4
2 3
2 4
3 4
*/