/* Author: goats_9 */
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
cin.tie(0)->sync_with_stdio(0);
int n, m;
cin >> n >> m;
vector<vector<int>> g(n), t(n);
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
g[--u].push_back(--v);
g[v].push_back(u);
}
vector<int> s, num(n, -1), low(n, -1), id(n), dp(2 * n);
int timer = 0, cnt = n, c = 0;
auto dfs = [&] (auto&& self, int u, int p) -> void {
num[u] = low[u] = timer++;
s.push_back(u);
c++;
for (int v : g[u]) {
if (v == p) continue;
if (num[v] == -1) {
self(self, v, u);
low[u] = min(low[u], low[v]);
if (num[u] <= low[v]) {
vector<int> comp{};
while (comp.empty() || comp.back() != v) {
comp.push_back(s.back());
s.pop_back();
}
t[u].push_back(cnt);
t.push_back(comp);
cnt++;
}
} else low[u] = min(low[u], num[v]);
}
};
ll ans = 0;
auto efs = [&] (auto&& self, int u, int p) -> void {
dp[u] = u < n;
for (int v : t[u]) {
if (v == p) continue;
self(self, v, u);
dp[u] += dp[v];
if (u >= n) ans -= t[u].size() * dp[v] * (dp[v] - 1);
}
if (u >= n) ans -= t[u].size() * (c - dp[u]) * (c - dp[u] - 1);
};
for (int i = 0; i < n; i++) {
if (num[i] != -1) continue;
c = 0;
dfs(dfs, i, -1);
ans += 1LL * c * (c - 1) * (c - 2);
efs(efs, i, -1);
}
cout << ans;
return 0;
}