#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mxN = 2e5 + 100;
vector<int> adj[mxN];
int n, m, ans = 0, s[mxN], szz[mxN], parent[mxN], cyc[mxN];
int find(int u){
if(parent[u] == u) return u;
return parent[u] = find(parent[u]);
}
void unite(int u, int v){
u = find(u), v = find(v);
if(u == v){
cyc[u] = 1;
}else{
cyc[v] |= cyc[u];
szz[v] += szz[u];
parent[u] = v;
}
}
int csz(int u){
return szz[find(u)];
}
long long answer(int u){
if(cyc[u]){
return (long long) szz[find(u)] * (szz[find(u)] - 1) * (szz[find(u)] - 2);
}else{
long long cur = 0;
for(int i = szz[find(u)] - 2; i >= 1; --i){
cur += (long long) (i * (i + 1)) / 2;
}
return cur * 2ll;
}
}
void dfs(int u = 1, int par = 0){
s[u] = 1;
int total = 0;
for(auto it : adj[u]){
if(it ^ par){
dfs(it, u);
ans += total * s[it];
total += s[it];
}
}
int left = csz(u) - total - 1;
ans += left * total;
s[u] += total;
}
/*
(n * (n - 1) / 2) * (n - 2) * 2
n * (n - 1) * (n - 2)
*/
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(nullptr); cout.tie(nullptr);
cin >> n >> m;
for(int i = 1; i <= n; ++i){
szz[i] = 1, parent[i] = i;
}
for(int i = 1, u, v ; i <= m; ++i){
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
unite(u, v);
}
for(int i = 1; i <= n; ++i) if(find(i) == i) ans += answer(i);
cout << ans << "\n";
return 0;
}