#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
const int N=705,low=700;
int n,m,sum,c[N];
bool vis[N][N];
void dfs(int u,int x)
{
    c[u]=x;
    if(x==1) sum++;
    else sum--;
    for(int i=1;i<=n;i++)
        if(vis[u][i])
    {
        if(c[i])
        {
            if(c[i]==c[u])
            {
                printf("-1\n");exit(0);
            }
        }
        else dfs(i,c[u]==1?2:1);
    }
}
vector<int>v;
bool dp[N<<1],f[N<<1];
int main()
{
    memset(vis,true,sizeof(vis));
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) vis[i][i]=false;
    for(int i=1;i<=m;i++)
    {
        int u,v;scanf("%d%d",&u,&v);
        vis[u][v]=vis[v][u]=false;
    }
    for(int i=1;i<=n;i++)
        if(!c[i]) sum=0,dfs(i,1),v.push_back(sum);
    dp[0+low]=true;
    for(int i=0;i<v.size();i++)
    {
        memset(f,false,sizeof(f));
        for(int j=-n;j<=n;j++)
            if(dp[j+low])
        {
            f[j+low-v[i]]=true;
            f[j+low+v[i]]=true;
        }
        for(int j=-n;j<=n;j++)
            dp[j+low]=f[j+low];
    }
    int ans=inf;
    for(int i=-n;i<=n;i++)
        if(dp[i+low])
        {
            int a=(n+i)/2,b=n-a;
            if(a==0||b==0) continue;
            ans=min(ans,a*(a-1)/2+b*(b-1)/2);
        }
    if(ans==inf) ans=-1;
    printf("%d\n",ans);
}
