#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int N = 1e2 + 5;
// Gọi f(u, v) là độ kết dính của hai đỉnh u, v
// Ta có f(u, v) = số cạnh xuất hiện trên mọi đường đi từ u đến v
// Gọi những cạnh đấy là e, ban đầu ta có u, v chung một thành phần liên thông (do u, v có thể đi đến được nhau)
// Sau khi bỏ e ra khỏi đồ thị thì u, v thuộc hai thành phần liên thông khác nhau
// => e là cạnh cầu
// Đến đây thay vì đi tính f(u, v) với mọi (u, v)
// thì với mỗi e ta sẽ đi tính g(e) = số cặp (u, v) mà sau khi bỏ e đi thì u, v không thể đi đến được nhau nữa
// Giả sử e = (a, b) với a là nút cha của b trên cây dfs
// Gọi sz[b] = Số đỉnh có trong cây con gốc b trên cây dfs
// Ban đầu đồ thị liên thông, khi bỏ e đi thì đồ thị sẽ bị tách thành 2 thành phần liên thông
// Trong đó có một thành phần liên thông có kích thước là sz[b], thành phần liên thông còn lại sẽ có kích thước là n - sz[b]
// => g(e) = sz[b] * (n - sz[b])
int n, m;
vector<int> adj[N];
int tin[N], low[N], timer;
int sz[N]; // sz[u] = Số đỉnh có trong cây con gốc u trên cây dfs
void dfs(int u, int p) {
tin[u] = low[u] = timer++;
sz[u] = 1;
for (int v : adj[u]) {
if (v == p) continue;
if (!tin[v]) {
dfs(v, u);
low[u] = min(low[u], low[v]);
sz[u] += sz[v];
}
else {
low[u] = min(low[u], tin[v]);
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
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);
}
timer = 0;
dfs(1, -1);
// Với một cạnh (u, v) bất kì sao cho u là cha của v trên cây dfs
// Ngoài điều kiện low[v] > tin[u] để xác định (u, v) có phải là cạnh cầu hay không
// ta còn có thể sử dụng điều kiện low[v] == tin[v] (điều kiện này hay ở chỗ ta không cần quan tâm đến nút cha của v)
int ans = 0;
for (int v = 1; v <= n; v++) {
if (low[v] == tin[v]) {
ans += sz[v] * (n - sz[v]);
}
}
cout << ans << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE4gPSAxZTIgKyA1OyAKCi8vIEfhu41pIGYodSwgdikgbMOgIMSR4buZIGvhur90IGTDrW5oIGPhu6dhIGhhaSDEkeG7iW5oIHUsIHYgCi8vIFRhIGPDsyBmKHUsIHYpID0gc+G7kSBj4bqhbmggeHXhuqV0IGhp4buHbiB0csOqbiBt4buNaSDEkcaw4budbmcgxJFpIHThu6sgdSDEkeG6v24gdiAKLy8gR+G7jWkgbmjhu69uZyBj4bqhbmggxJHhuqV5IGzDoCBlLCBiYW4gxJHhuqd1IHRhIGPDsyB1LCB2IGNodW5nIG3hu5l0IHRow6BuaCBwaOG6p24gbGnDqm4gdGjDtG5nIChkbyB1LCB2IGPDsyB0aOG7gyDEkWkgxJHhur9uIMSRxrDhu6NjIG5oYXUpIAovLyBTYXUga2hpIGLhu48gZSByYSBraOG7j2kgxJHhu5MgdGjhu4sgdGjDrCB1LCB2IHRodeG7mWMgaGFpIHRow6BuaCBwaOG6p24gbGnDqm4gdGjDtG5nIGtow6FjIG5oYXUKLy8gPT4gZSBsw6AgY+G6oW5oIGPhuqd1Ci8vIMSQ4bq/biDEkcOieSB0aGF5IHbDrCDEkWkgdMOtbmggZih1LCB2KSB24bubaSBt4buNaSAodSwgdikKLy8gdGjDrCB24bubaSBt4buXaSBlIHRhIHPhur0gxJFpIHTDrW5oIGcoZSkgPSBz4buRIGPhurdwICh1LCB2KSBtw6Agc2F1IGtoaSBi4buPIGUgxJFpIHRow6wgdSwgdiBraMO0bmcgdGjhu4MgxJFpIMSR4bq/biDEkcaw4bujYyBuaGF1IG7hu69hCi8vIEdp4bqjIHPhu60gZSA9IChhLCBiKSB24bubaSBhIGzDoCBuw7p0IGNoYSBj4bunYSBiIHRyw6puIGPDonkgZGZzCi8vIEfhu41pIHN6W2JdID0gU+G7kSDEkeG7iW5oIGPDsyB0cm9uZyBjw6J5IGNvbiBn4buRYyBiIHRyw6puIGPDonkgZGZzCi8vIEJhbiDEkeG6p3UgxJHhu5MgdGjhu4sgbGnDqm4gdGjDtG5nLCBraGkgYuG7jyBlIMSRaSB0aMOsIMSR4buTIHRo4buLIHPhur0gYuG7iyB0w6FjaCB0aMOgbmggMiB0aMOgbmggcGjhuqduIGxpw6puIHRow7RuZyAKLy8gVHJvbmcgxJHDsyBjw7MgbeG7mXQgdGjDoG5oIHBo4bqnbiBsacOqbiB0aMO0bmcgY8OzIGvDrWNoIHRoxrDhu5tjIGzDoCBzeltiXSwgdGjDoG5oIHBo4bqnbiBsacOqbiB0aMO0bmcgY8OybiBs4bqhaSBz4bq9IGPDsyBrw61jaCB0aMaw4bubYyBsw6AgbiAtIHN6W2JdCi8vID0+IGcoZSkgPSBzeltiXSAqIChuIC0gc3pbYl0pCgppbnQgbiwgbTsgIAp2ZWN0b3I8aW50PiBhZGpbTl07IAoKaW50IHRpbltOXSwgbG93W05dLCB0aW1lcjsgIAppbnQgc3pbTl07IC8vIHN6W3VdID0gU+G7kSDEkeG7iW5oIGPDsyB0cm9uZyBjw6J5IGNvbiBn4buRYyB1IHRyw6puIGPDonkgZGZzCgp2b2lkIGRmcyhpbnQgdSwgaW50IHApIHsKCXRpblt1XSA9IGxvd1t1XSA9IHRpbWVyKys7IAoJc3pbdV0gPSAxOyAgIAoKCWZvciAoaW50IHYgOiBhZGpbdV0pIHsKCQlpZiAodiA9PSBwKSBjb250aW51ZTsgICAKCQlpZiAoIXRpblt2XSkgewoJCQlkZnModiwgdSk7ICAKCQkJbG93W3VdID0gbWluKGxvd1t1XSwgbG93W3ZdKTsgCgkJCXN6W3VdICs9IHN6W3ZdOwoJCX0KCQllbHNlIHsKCQkJbG93W3VdID0gbWluKGxvd1t1XSwgdGluW3ZdKTsgCgkJfQoJfQp9CgoKaW50IG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IAoJY2luLnRpZShudWxscHRyKTsgCQoJY2luID4+IG4gPj4gbTsgCgoJZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKCQlpbnQgdSwgdjsgCgkJY2luID4+IHUgPj4gdjsgCgkJYWRqW3VdLnB1c2hfYmFjayh2KTsgCgkJYWRqW3ZdLnB1c2hfYmFjayh1KTsgCgl9CgoJdGltZXIgPSAwOyAgCglkZnMoMSwgLTEpOyAgCgoJLy8gVuG7m2kgbeG7mXQgY+G6oW5oICh1LCB2KSBi4bqldCBrw6wgc2FvIGNobyB1IGzDoCBjaGEgY+G7p2EgdiB0csOqbiBjw6J5IGRmcwoJLy8gTmdvw6BpIMSRaeG7gXUga2nhu4duIGxvd1t2XSA+IHRpblt1XSDEkeG7gyB4w6FjIMSR4buLbmggKHUsIHYpIGPDsyBwaOG6o2kgbMOgIGPhuqFuaCBj4bqndSBoYXkga2jDtG5nCgkvLyB0YSBjw7JuIGPDsyB0aOG7gyBz4butIGThu6VuZyDEkWnhu4F1IGtp4buHbiBsb3dbdl0gPT0gdGluW3ZdICjEkWnhu4F1IGtp4buHbiBuw6B5IGhheSDhu58gY2jhu5cgdGEga2jDtG5nIGPhuqduIHF1YW4gdMOibSDEkeG6v24gbsO6dCBjaGEgY+G7p2EgdikKCWludCBhbnMgPSAwOyAgCglmb3IgKGludCB2ID0gMTsgdiA8PSBuOyB2KyspIHsKCQlpZiAobG93W3ZdID09IHRpblt2XSkgewoJCQlhbnMgKz0gc3pbdl0gKiAobiAtIHN6W3ZdKTsgCgkJfQoJfQoKCWNvdXQgPDwgYW5zIDw8ICdcbic7IAp9