#include<bits/stdc++.h> 
typedef long long ll;
#define REP(i,n) for(int i = 0;i < (n);i++)
using namespace std;
const int INF = 1e9;
int n,m,a,b,ans,ckazu,d,e;
int hen[705][705];
int wi[705];
bool dp[777][777];
vector<pair<int,int> > c(705);
void bfs(int now){
  if(wi[now]!=0)return;
  else {wi[now]=1;c[ckazu].first++;}
  queue<int> q;
  q.push(now);
  while(!q.empty()){
    int ne=q.front();q.pop();
    for(int i=0;i<n;i++){
      if(i!=ne && hen[ne][i]==false){
	if(wi[i]==0){
	  wi[i]=-1*wi[ne];
	  if(wi[i]==1){
	    c[ckazu].first++;
	  }else{
	    c[ckazu].second++;
	  }
	  q.push(i);
	}else if(wi[i]==wi[ne]){
	  ans=-1;return;
	}
      }
    }
  }

  ckazu++;
  return;
}

int main(){
  cin>>n>>m;
  REP(i,m){
    cin>>a>>b;
    a--;b--;
    hen[b][a]=hen[a][b]=true;
  }
  ckazu=0;
  for(int i=0;i<n;i++){
    bfs(i);
    if(ans==-1){
      cout<<-1<<endl;return 0;
    }
  }
  dp[0][0]=true;
  ans=INF;
  for(int i=1;i<ckazu+1;i++){
    for(int j=0;j<=n;j++){
      if(dp[i-1][j]==true){
	dp[i][j+c[i-1].first]=true;
	dp[i][j+c[i-1].second]=true;
      }
    }
  }
  for(int i=0;i<=n;i++){
    if(dp[ckazu][i]==true){
      int tmp=i*(i-1)/2+(n-i)*(n-i-1)/2;
      
      ans=min(ans,tmp);
    }
  }
  cout<<ans<<endl;
  return 0;
}


