# include <bits/stdc++.h>
using namespace std;
# define fi cin
# define fo cout
# define x first
# define y second
# define ll long long
# define db long double
# define scn(x) scanf("%I64d",&x)
# define scan(x) scanf("%d",&x)
# define print(x) printf("%d ",x)
# define prnt(x) printf("%I64d ",x);
# define eol printf("\n")
# define IOS ios_base :: sync_with_stdio(0)
# define pe "Possible"
# define ie "Impossible"
# define halt(...) {fo << (__VA_ARGS__) << '\n';exit(0);}
# define rep1(n) for (int qwerty = 1;qwerty <= n;++qwerty)
# define pp(n) cerr << #n << " = " << n << '\n'
# define ppp(v) for (auto it : v) cerr << it << ' ';cerr << '\n'
# define aprint(x,y,z) for (int i = x;i <= y;++i) cerr << z[i] << ' ';cerr << '\n'
# define rep(n) for (int i = 1;i <= n;++i)
const int mod = 1e9 + 7;
ll dp[1 << 19][19];
vector < int > s[55];
int Log[1 << 20];
int v[55][55];
int main(void)
{
#ifdef CF
ifstream fi("input");
#endif // CF
srand(time(0));
fo << fixed << setprecision(7);
cerr << fixed << setprecision(7);
int n,m;
fi>>n>>m;
rep1(m)
{
int a,b;
fi>>a>>b;
--a;--b;
v[a][b] = v[b][a] = 1;
s[a].push_back(b);
s[b].push_back(a);
}
for (int i = 2;i <= 1e6;++i) Log[i] = Log[i/2] + 1;
for (int i = 0;i < n;++i) dp[1 << i][i] = 1;
for (int mask = 1;mask < (1 << n);++mask)
if (__builtin_popcount(mask) > 1)
{
for (int i = 0;i < n;++i)
if (((mask >> i)&1) && i != Log[mask & (-mask)])
for (auto it : s[i])
if ((mask >> it)&1)
dp[mask][i] += dp[mask ^ (1 << i)][it];
}
ll ans = 0;
for (int mask = 1;mask < (1 << n);++mask)
for (int i = 0;i < n;++i)
if (__builtin_popcount(mask) >= 3 && (((mask >> i)&1)) && v[Log[mask&(-mask)]][i])
ans += dp[mask][i];
ans /= 2;
fo << ans << '\n';
return 0;
}