Problem:
Score : 500 points

Problem Statement

Rng has a connected undirected graph with N vertices.
Currently, there are M edges in the graph, and the i-th edge connects Vertices A_i and B_i.

Rng will add new edges to the graph by repeating the following operation:

Operation: Choose u and v (u \neq v) such that Vertex v can be reached by traversing exactly three edges from Vertex u, and add an edge connecting Vertices u and v. It is not allowed to add an edge if there is already an edge connecting Vertices u and v.

Find the maximum possible number of edges that can be added.

Constraints

2 \leq N \leq 10^5

1 \leq M \leq 10^5

1 \leq A_i,B_i \leq N

The graph has no self-loops or multiple edges.

The graph is connected.

Input

Input is given from Standard Input in the following format:

N M
A_1 B_1
A_2 B_2
:
A_M B_M

Output

Find the maximum possible number of edges that can be added.

Sample Input 1

6 5
1 2
2 3
3 4
4 5
5 6

Sample Output 1

4

If we add edges as shown below, four edges can be added, and no more.

Sample Input 2

5 5
1 2
2 3
3 1
5 4
5 1

Sample Output 2

5

Five edges can be added, for example, as follows:

Add an edge connecting Vertex 5 and Vertex 3.

Add an edge connecting Vertex 5 and Vertex 2.

Add an edge connecting Vertex 4 and Vertex 1.

Add an edge connecting Vertex 4 and Vertex 2.

Add an edge connecting Vertex 4 and Vertex 3.

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include "bits/stdc++.h"
using namespace std;

vector<int> G[100002];
vector<int> c(1e5+2,-1);
int nib=0;
int ans=0;
int deep;
vector<int> used(1e5+2,0);

int dfs(int p,int g){
	if(deep==3){
		int flag=0;
		for(int j=0;j<G[p].size();j++){
			if(G[p][j]==g){
				flag=1;
				//cout<<"aaa"<<" "<<p+1<<" "<<g+1<<endl;
				break;
			}
		}
		if(flag==0){
			ans++;
			G[g].push_back(p);
			G[p].push_back(g);
			//cout<<g+1<<" "<<p+1<<endl;
		}
		return 0;
	}
	
	for(int i=0;i<G[p].size();i++){
		if(used[G[p][i]]==0){
			used[G[p][i]]=1;
			deep++;
			dfs(G[p][i],g);
			deep--;
			used[G[p][i]]=0;
		}
	}
	return 0;
}

int nibu(int p,int x){
	for(int i=0;i<G[p].size();i++){
		if(c[G[p][i]]==-1){
			c[G[p][i]]=abs(x-1);
			nibu(G[p][i],abs(x-1));
		}else if(c[G[p][i]]==x){
			nib=1;
			return 0;
		}
	}
	return 0;
}

int main(){
	int n,m;
	cin>>n>>m;
	for(int i=0;i<m;i++){
		int a,b;
		cin>>a>>b;
		a--;
		b--;
		G[a].push_back(b);
		G[b].push_back(a);
	}
	
	for(int i=0;i<n;i++){
		used[i]=1;
		deep=0;
		dfs(i,i);
		used[i]=0;
	}
	
	for(int i=0;i<used.size();i++)used[i]=0;
	
	for(int i=0;i<n;i++){
		used[i]=1;
		deep=0;
		dfs(i,i);
		used[i]=0;
	}
	
	c[0]=0;
	nibu(0,0);
	
	//cout<<nib<<endl;
	
	if(nib==0){
		cout<<ans<<endl;
	}else{
		cout<<n*(n-3)/2-m<<endl;
	}
	return 0;
}