去除所有不对的边
#include <bits/stdc++.h>
using namespace std;
#define p_qu priority_queue
#define p_qu_less priority_queue<int, vector<int>, greater<int> >
#define C_in(a,n) for(int i=0;i<n;i++) cin>>a[i]
#define C_out(a,n) for(int i=0;i<n;i++) cout<<a[i]<<" "
#define SUM(a,n,sum) sum[0]=a[0];for(int i=1;i<n;i++) sum[i]=sum[i-1]+a[i];
#define SUM2(a,n,m,sum) sum[0][0]=a[0][0]; for(int i=0;i<n;i++) for(int j=0;j<m;j++) sum[i][j]=(i!=0?sum[i-1][j]:0)+(j!=0?sum[i][j-1]:0)+a[i][j]-(i!=0 && j!=0?sum[i-1][j-1]:0)
#define all(a) a.begin(),a.end()
#define l_b lower_bound
#define u_b upper_bound
#define pb push_back
#define max_3(a,b,c) max(max(a,b),c)
#define max_4(a,b,c,d) max(a,max_3(b,c,d))
#define min_3(a,b,c) min(min(a,b),c)
#define min_4(a,b,c,d) min(a,min_3(b,c,d))
#define zero(a) memset(a, 0, sizeof(a))
#define msit multiset<int>::iterator
#define setit set<int>::iterator
#define int long long
const int N=500005;
int h_c=0;
vector<int> g[N];
int vis[N];
int last[N];
int b,w;
int ok=0;
void have_c(int now,int fa)
{
//cout<<now<<" "<<h_c<<endl;
if(vis[now])
{
if((h_c-last[now])%2==1)
{
cout<<0;
ok=1;
}
return;
}
last[now]=h_c;
vis[now]=1;
h_c++;
for(int i=0;i<g[now].size();i++)
{
if(g[now][i]==fa) continue;
have_c(g[now][i],now);
}
h_c--;
}
void dfs(int now,int lc)
{
if(vis[now])
{
return;
}
lc+=1;
lc%=2;
if(lc==1) b++;
else w++;
vis[now]=1;
for(int i=0;i<g[now].size();i++)
{
dfs(g[now][i],lc);
}
return;
}
int n,m;
signed main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
cin>>n>>m;
for(int i=0;i<m;i++)
{
int u,v;
cin>>u>>v;
g[u].pb(v);
g[v].pb(u);
}
for(int i=1;i<=n;i++)
{
if(!vis[i]) have_c(i,-1);
}
if(ok) return 0;
zero(vis);
int ans=(n*(n-1)/2)-m;
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
b=w=0;
dfs(i,0);
//cout<<b<<" "<<w<<endl;
ans-=(w*(w-1)/2);
ans-=(b*(b-1)/2);
}
}
cout<<ans;
return 0;
}