#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int N=700;
int n,m,cnt1,cnt2;
int d[N+10][N+10],vis[N+10],f[N+10],g[N+10];
bool dfs(int x,int kx) {
    if (vis[x]&&vis[x]!=kx) return 0;
    if (vis[x]) return 1;
    vis[x]=kx;
    if (kx==1) cnt1++;
    else cnt2++;
    for (int i=1;i<=n;i++)
        if (!d[x][i])
            if (!dfs(i,((kx-1)^1)+1)) return 0;
    return 1;
}
void work(int cnt1,int cnt2) {
    for (int i=0;i<=n;i++) g[i]=0;
    for (int i=0;i<=n;i++)
        if (f[i]) g[i+cnt1]=g[i+cnt2]=1;
    for (int i=0;i<=n;i++) f[i]=g[i];
}
int main() {
    f[0]=1;
    scanf("%d%d",&n,&m);
    for (int i=1;i<=m;i++) {
        int u,v;
        scanf("%d%d",&u,&v);
        d[u][v]=d[v][u]=1;
    }
    for (int i=1;i<=n;i++) d[i][i]=1;
    memset(vis,0,sizeof(vis));
    for (int i=1;i<=n;i++)
        if (!vis[i]) {
            cnt1=cnt2=0;
            if (!dfs(i,1)) {
                printf("-1\n");
                return 0;
            }
            work(cnt1,cnt2);
        }
    int ans=1e9;
    for (int i=0;i<=n;i++)
        if (f[i]) ans=min(ans,(i-1)*i/2+(n-i)*(n-i-1)/2);
    printf("%d\n",ans);
    return 0;
}
