#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#define pi 3.141592653589793238
#define int long long
using namespace __gnu_pbds;
using namespace std;
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

// mt19937 gen_rand_int(chrono::steady_clock::now().time_since_epoch().count());
// mt19937_64 gen_rand_ll(chrono::steady_clock::now().time_since_epoch().count());
// mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

long long power(long long a, long long b,long long m) {
    long long res = 1;
    while (b > 0) {
        if (b & 1)
            res = res * a %m;
        a = a * a %m;
        b >>= 1;
    }
    return res;
}

map<int,map<int,int> >mm;
vector<vector<int> >adj;
vector<pair<int,int> >fi;
int tot[2];
int vis[705];
vector<int>temp[2];
bool flag=false;
int dp[705][705];
vector<int>val;
void dfs(int ver,int x)
{
    if(flag)
        return ;
    tot[x]++;
    vis[ver]=x;
    temp[x].push_back(ver);
    for(auto i:adj[ver])
    {
        if(vis[i]==-1)
        {
            dfs(i,(x+1)%2);
        }
        else if(vis[i]!=(x+1)%2)
        {
            flag=true;
            return ;
        }
    }
}

signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);  
cout.tie(0);   

#ifndef ONLINE_JUDGE
    if(fopen("INPUT.txt","r"))
    {
    freopen ("INPUT.txt" , "r" , stdin);
    freopen ("OUTPUT.txt" , "w" , stdout);
    }
#endif  

    int n,m;
    cin>>n>>m;
    int x,y;
    adj.resize(n+1);
    for(int i=0;i<m;i++)
    {
        cin>>x>>y;
        mm[x][y]=1;
        mm[y][x]=1;
    }
    for(int i=1;i<=n;i++)
    {
        vis[i]=-1;
        for(int j=i+1;j<=n;j++)
            if(!mm[i][j])
            {
                adj[i].push_back(j);
                adj[j].push_back(i);
            }
    }

    for(int i=1;i<=n;i++)
    {
        if(vis[i]==-1)
        {
            temp[0].clear();
            temp[1].clear();
            tot[0]=0;
            tot[1]=0;
            dfs(i,0);
            fi.push_back({tot[0],tot[1]});
            int sz=temp[0].size();
            int cnt=0;
            for(int j=0;j<sz;j++)
            {
                for(int k=j+1;k<sz;k++)
                {
                    if(mm[temp[0][j]][temp[0][k]])
                        cnt++;
                }
            }
            sz=temp[1].size();
            for(int j=0;j<sz;j++)
            {
                for(int k=j+1;k<sz;k++)
                {
                    if(mm[temp[1][j]][temp[1][k]])
                        cnt++;
                }
            }

            val.push_back(cnt);
        }
    }
    
    if(flag)
    {
        cout<<-1;
        return 0;
    }
    fill_n(&dp[0][0],705*705,1e17);
    int sz=fi.size();
    dp[0][0]=0;
    int res=0;

    for(int i=0;i<sz;i++)
    {
        for(int j=0;j<=n;j++)
        {
            if(j-fi[i].first>=0 && res>=j-fi[i].first)
                dp[i+1][j]=min(dp[i+1][j],dp[i][j-fi[i].first]+(fi[i].first*(j-fi[i].first))+fi[i].second*(res-(j-fi[i].first))+val[i]);            
            swap(fi[i].first,fi[i].second);
            if(j-fi[i].first>=0 && res>=j-fi[i].first)
                dp[i+1][j]=min(dp[i+1][j],dp[i][j-fi[i].first]+(fi[i].first*(j-fi[i].first))+fi[i].second*(res-(j-fi[i].first))+val[i]);            
        }
        res+=fi[i].first+fi[i].second;
    }

    int mn=1e17;
    for(int i=0;i<=n;i++)
        mn=min(mn,dp[sz][i]);
    cout<<mn;
} 
    


Measured memory_bytes: 38200