#include using namespace std; int N, M; int g[20][20]; vector>dp(20, vector(1<<20, -1)); long long solve(int node, int mask) { long long &ret = dp[node][mask]; if(ret!=-1) return ret; ret = 0; int smallest = __builtin_ctz(mask); if(__builtin_popcount(mask)>2) ret += g[node][smallest]; for(int to=smallest+1; to> to & 1) { if(g[node][to]) ret += solve(to, mask|(1<> N >> M; for(int i=0; i> u >> v; --u, --v; g[u][v] = g[v][u] = 1; } long long ans = 0; for(int i=0; i