#include "bits/stdc++.h"
using namespace std;
const int N=1e5+1;
int n, m;
vector<int> adj[N];
vector<int> v[N];
int cnt[N];
bool vis[N];
int t;
int tin[N];
int sz[N];
int par[N];
int siz;
bool bridge;
int cmp;
const int MOD=998244353;
int add(int a, int b){
return (a+b)%MOD;
}
void add2(int &a, int b){
a+=b;
if(a>=MOD) a-=MOD;
}
void dfs(int x){
vis[x]=1;
tin[x]=++t;
sz[x]=1;
for(int k:adj[x]){
if(!vis[k]){
dfs(k);
sz[x]+=sz[k];
par[k]=x;
// cout << "par[" << k << "] = " << x << "\n";
}
}
}
int dfs2(int x){
int low=1e9;
for(int k:adj[x]){
if(k==par[x]) continue;
if(par[k]==x){
low=min(low, dfs2(k));
}
else low=min(low, tin[k]);
}
// cout << "dfs2 " << x << " " << low << '\n';
if(par[x] && low>=tin[x]){
v[siz].push_back(sz[x]);
bridge=1;
// cout << par[x] << "->" << x << " bridge\n";
}
return low;
}
int main(){
cin.tie(0)->sync_with_stdio(0);
cin >> n >> m;
for(int i=0; i<m; i++){
int u,v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
for(int i=1; i<=n; i++){
if(vis[i]) continue;
dfs(i);
cnt[sz[i]]++;
siz=sz[i];
cmp++;
dfs2(i);
}
vector<int> dp(n+1);
dp[0]=1;
for(int i=1; i<=n; i++){
if(!cnt[i]) continue;
vector<int> ps(n+1);
ps[0]=1;
for(int j=1; j<=n; j++){
ps[j]=add(j-i>=0?ps[j-i]:0, dp[j]);
}
for(int j=1; j<=n; j++){
dp[j]=ps[j]-(j-i*(cnt[i]+1)>=0?ps[j-i*(cnt[i]+1)]:0);
if(dp[j]<0) dp[j]+=MOD;
}
}
long long ans=-1;
cnt[0]=1;
v[0].push_back(0);
for(int i=0; i<=n; i++){
if(!cnt[i]) continue;
for(int j=n; j>=cnt[i]*i; j--){
if(i) dp[j]-=dp[j-cnt[i]*i];
if(dp[j]<0) dp[j]+=MOD;
}
vector<int> pos;
for(int j=0; j<=n; j++){
if(dp[j]) pos.push_back(j);
}
int s=v[i].size();
for(int j=0; j<s; j++) v[i].push_back(i-v[i][j]);
sort(v[i].begin(), v[i].end());
v[i].erase(unique(v[i].begin(), v[i].end()), v[i].end());
int j=0;
reverse(v[i].begin(), v[i].end());
for(int k:v[i]){
while(j+1<int(pos.size()) && pos[j+1]+k<=n/2) j++;
if(pos[j]+k<=n/2) ans=max(ans, (long long)pos[j]+k);
}
for(int j=cnt[i]*i; j<=n; j++){
if(i) dp[j]+=dp[j-cnt[i]*i];
if(dp[j]>=MOD) dp[j]-=MOD;
}
}
if(cmp==1 && !bridge) ans=-1;
cout << (ans==-1?-1:ans*(ans-1)/2 + ((long long)n-ans)*(n-ans-1)/2 + 1 - m);
}
I2luY2x1ZGUgImJpdHMvc3RkYysrLmgiCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTj0xZTUrMTsKaW50IG4sIG07CnZlY3RvcjxpbnQ+IGFkaltOXTsKdmVjdG9yPGludD4gdltOXTsKaW50IGNudFtOXTsKYm9vbCB2aXNbTl07CmludCB0OwppbnQgdGluW05dOwppbnQgc3pbTl07CmludCBwYXJbTl07CmludCBzaXo7CmJvb2wgYnJpZGdlOwppbnQgY21wOwoKY29uc3QgaW50IE1PRD05OTgyNDQzNTM7CgppbnQgYWRkKGludCBhLCBpbnQgYil7CglyZXR1cm4gKGErYiklTU9EOwp9Cgp2b2lkIGFkZDIoaW50ICZhLCBpbnQgYil7CglhKz1iOwoJaWYoYT49TU9EKSBhLT1NT0Q7Cn0KCnZvaWQgZGZzKGludCB4KXsKCXZpc1t4XT0xOwoJdGluW3hdPSsrdDsKCXN6W3hdPTE7Cglmb3IoaW50IGs6YWRqW3hdKXsKCQlpZighdmlzW2tdKXsKCQkJZGZzKGspOwoJCQlzelt4XSs9c3pba107CgkJCXBhcltrXT14OwoJCQkvLyBjb3V0IDw8ICJwYXJbIiA8PCBrIDw8ICJdID0gIiA8PCB4IDw8ICJcbiI7CgkJfQoJfQp9CgppbnQgZGZzMihpbnQgeCl7CglpbnQgbG93PTFlOTsKCWZvcihpbnQgazphZGpbeF0pewoJCWlmKGs9PXBhclt4XSkgY29udGludWU7CgkJaWYocGFyW2tdPT14KXsKCQkJbG93PW1pbihsb3csIGRmczIoaykpOwoJCX0KCQllbHNlIGxvdz1taW4obG93LCB0aW5ba10pOwoJfQoJLy8gY291dCA8PCAiZGZzMiAiIDw8IHggPDwgIiAiIDw8IGxvdyA8PCAnXG4nOwoJaWYocGFyW3hdICYmIGxvdz49dGluW3hdKXsKCQl2W3Npel0ucHVzaF9iYWNrKHN6W3hdKTsKCQlicmlkZ2U9MTsKCQkvLyBjb3V0IDw8IHBhclt4XSA8PCAiLT4iIDw8IHggPDwgIiBicmlkZ2VcbiI7Cgl9CglyZXR1cm4gbG93Owp9CgppbnQgbWFpbigpewoJY2luLnRpZSgwKS0+c3luY193aXRoX3N0ZGlvKDApOwoKCWNpbiA+PiBuID4+IG07Cglmb3IoaW50IGk9MDsgaTxtOyBpKyspewoJCWludCB1LHY7IAoJCWNpbiA+PiB1ID4+IHY7CgkJYWRqW3VdLnB1c2hfYmFjayh2KTsKCQlhZGpbdl0ucHVzaF9iYWNrKHUpOwoJfQoKCWZvcihpbnQgaT0xOyBpPD1uOyBpKyspewoJCWlmKHZpc1tpXSkgY29udGludWU7CgkJZGZzKGkpOwoJCWNudFtzeltpXV0rKzsKCQlzaXo9c3pbaV07CgkJY21wKys7CgkJZGZzMihpKTsKCX0KCQoJdmVjdG9yPGludD4gZHAobisxKTsKCWRwWzBdPTE7CgkKCWZvcihpbnQgaT0xOyBpPD1uOyBpKyspewoJCWlmKCFjbnRbaV0pIGNvbnRpbnVlOwoJCXZlY3RvcjxpbnQ+IHBzKG4rMSk7CgkJcHNbMF09MTsKCQlmb3IoaW50IGo9MTsgajw9bjsgaisrKXsKCQkJcHNbal09YWRkKGotaT49MD9wc1tqLWldOjAsIGRwW2pdKTsKCQl9CgkJZm9yKGludCBqPTE7IGo8PW47IGorKyl7CgkJCWRwW2pdPXBzW2pdLShqLWkqKGNudFtpXSsxKT49MD9wc1tqLWkqKGNudFtpXSsxKV06MCk7CgkJCWlmKGRwW2pdPDApIGRwW2pdKz1NT0Q7CgkJfQoJfQoJCglsb25nIGxvbmcgYW5zPS0xOwoJCgljbnRbMF09MTsKCXZbMF0ucHVzaF9iYWNrKDApOwoJZm9yKGludCBpPTA7IGk8PW47IGkrKyl7CgkJaWYoIWNudFtpXSkgY29udGludWU7CgkJZm9yKGludCBqPW47IGo+PWNudFtpXSppOyBqLS0pewoJCQlpZihpKSBkcFtqXS09ZHBbai1jbnRbaV0qaV07CgkJCWlmKGRwW2pdPDApIGRwW2pdKz1NT0Q7CgkJfQoJCXZlY3RvcjxpbnQ+IHBvczsKCQlmb3IoaW50IGo9MDsgajw9bjsgaisrKXsKCQkJaWYoZHBbal0pIHBvcy5wdXNoX2JhY2soaik7CgkJfQoJCWludCBzPXZbaV0uc2l6ZSgpOwoJCWZvcihpbnQgaj0wOyBqPHM7IGorKykgdltpXS5wdXNoX2JhY2soaS12W2ldW2pdKTsKCQlzb3J0KHZbaV0uYmVnaW4oKSwgdltpXS5lbmQoKSk7CgkJdltpXS5lcmFzZSh1bmlxdWUodltpXS5iZWdpbigpLCB2W2ldLmVuZCgpKSwgdltpXS5lbmQoKSk7CgkJaW50IGo9MDsKCQlyZXZlcnNlKHZbaV0uYmVnaW4oKSwgdltpXS5lbmQoKSk7CgkJZm9yKGludCBrOnZbaV0pewoJCQl3aGlsZShqKzE8aW50KHBvcy5zaXplKCkpICYmIHBvc1tqKzFdK2s8PW4vMikgaisrOwoJCQlpZihwb3Nbal0razw9bi8yKSBhbnM9bWF4KGFucywgKGxvbmcgbG9uZylwb3Nbal0rayk7CgkJfQoJCQoJCWZvcihpbnQgaj1jbnRbaV0qaTsgajw9bjsgaisrKXsKCQkJaWYoaSkgZHBbal0rPWRwW2otY250W2ldKmldOwoJCQlpZihkcFtqXT49TU9EKSBkcFtqXS09TU9EOwoJCX0KCX0KCWlmKGNtcD09MSAmJiAhYnJpZGdlKSBhbnM9LTE7Cgljb3V0IDw8IChhbnM9PS0xPy0xOmFucyooYW5zLTEpLzIgKyAoKGxvbmcgbG9uZyluLWFucykqKG4tYW5zLTEpLzIgKyAxIC0gbSk7Cn0=