#include <bits/stdc++.h>
#define ll long long int
#define mp make_pair
#define pb push_back
#define ff first 
#define ss second
#define mod 1000000007
#define lim 100005
#define nfs_mw ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;

int vis[710] = {}, state[710] = {}, pos[1500] = {}, ngh[710][710] = {};
vector<int> gr[710];

void dfs(int u, int wtf, pair<int,int>& cnt){
	vis[u] = 1;
	state[u] = wtf;
	if(wtf) cnt.ff++; else cnt.ss++;
	for(int v:gr[u]){
		if(!vis[v]) dfs(v,wtf^1,cnt);
		else if(state[v] == state[u]) { cout<<"-1\n"; exit(0); }
	}
}

int main()
{
	nfs_mw;
	int i,j,n,m,u,v;
	cin>>n>>m;
	for(i=0; i<m; i++) {
		cin>>u>>v;
		ngh[u][v] = ngh[v][u] = 1;
	}

	for(i=1; i<=n; i++)
		for(j=1; j<=n; j++)
			if(i!=j && !ngh[i][j])
				gr[i].pb(j);

	vector< pair<int,int> > pairs;
	for(i=1; i<=n; i++) if(!vis[i]) {
		pair<int,int> nxt = mp(0,0);
		dfs(i,0,nxt);
		pairs.pb(nxt);
	}

	pos[0] = 1;
	for(auto p:pairs)
		for(j=n; j>=0; j--) {
			if(!pos[j]) continue;
			pos[j] = 0;
			pos[j+p.ff] = 1;
			pos[j+p.ss] = 1;
		}

	int ans = 700*700*700;
	for(j=n; j>=0; j--) if(pos[j]) ans = min(ans, (((j*(j-1))/2) + (((n-j)*(n-j-1))/2)));
	cout<<ans<<"\n";
	return 0;
}