#include<bits/stdc++.h> #define MAXN 705 usingnamespace std; inlineintread(){ int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9'){ if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9'){ x=(x*10)+(ch-'0'); ch=getchar(); } return x*f; } int G[MAXN][MAXN]; int a[MAXN],stk[MAXN],top,vis[MAXN]; inlineintCheck(int x){ for (registerint i=1;i<=top;++i){ if (G[stk[i]][x]==false){ returnfalse; } } returntrue; } int stk1[MAXN],top1,n,m; inlineintCheckElse(){ top1=0; for (registerint i=1;i<=n;++i){ if (!vis[i]) stk1[++top1]=i; } for (registerint i=1;i<=top1;++i){ for (registerint j=i+1;j<=top1;++j){ if (G[stk1[i]][stk1[j]]==false) returnfalse; } } returntrue; } inlineintCalcEdge(int x){ return x*(x-1)/2; } inlineintBest(){ returnCalcEdge(n/2)+CalcEdge(n-n/2); } intmain(){ n=read(),m=read(); for (registerint i=1;i<=m;++i){ int u=read(),v=read(); G[u][v]=G[v][u]=true; } for (registerint i=1;i<=n;++i){ a[i]=i; } int ans=0x7fffffff; int best=Best(); for (registerint t=1;t<=33;++t){ random_shuffle(a+1,a+1+n); top=0; memset(vis,0,sizeof(vis)); for (registerint j=1;j<=n;++j){ if (Check(a[j])) stk[++top]=a[j],vis[a[j]]=true; int temp=CalcEdge(top)+CalcEdge(n-top); if (temp<ans){ if (CheckElse()) ans=temp; } } if (ans==best) break; } printf("%d\n",ans==0x7fffffff?-1:ans); }