//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("unroll-loops")
#include <iostream>
#include <stdlib.h>
#include <cmath>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <random>
#include <assert.h>
#include <memory.h>
#define uint unsigned int
#define ll long long
#define ull unsigned long long
#define ld long double
#define rep(i, l, r) for (int i = l; i < r; i++)
#define repb(i, r, l) for (int i = r; i > l; i--)
#define sz(a) (int)a.size()
#define fi first
#define se second
#define mp(a, b) make_pair(a, b)
using namespace std;
inline void setmin(int &x, int y) { if (y < x) x = y; }
inline void setmax(int &x, int y) { if (y > x) x = y; }
inline void setmin(ll &x, ll y) { if (y < x) x = y; }
inline void setmax(ll &x, ll y) { if (y > x) x = y; }
const int N = 100000;
const int inf = (int)1e9 + 1;
const ll big = (ll)1e18 + 1;
const int P = 239;
const int P1 = 31;
const int P2 = 57;
const int MOD = (int)1e9 + 7;
const int MOD1 = (int)1e9 + 9;
const int MOD2 = 998244353;
const double eps = 1e-9;
const double pi = atan2(0, -1);
const int ABC = 26;
vector<int> g[N];
int cnt[N];
bool used[N];
int ttt = 0;
int in[N];
int up[N];
set<pair<int, int> > good;
void dfs(int u, int par) {
used[u] = true;
in[u] = up[u] = ttt++;
for (int v : g[u]) {
if (!used[v]) {
dfs(v, u);
setmin(up[u], up[v]);
if (up[v] == in[v]) {
good.insert({u, v});
}
} else {
if (v != par) {
setmin(up[u], in[v]);
}
}
}
}
int main()
{
//freopen("a.in", "r", stdin);
//freopen("dsu.out", "w", stdout);
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.precision(20);
cout << fixed;
//ll TL = 0.95 * CLOCKS_PER_SEC;
//clock_t time = clock();
int n,m;
cin >> n >>m;
int u, v;
while (cin >> u >> v) {
u--; v--;
g[u].push_back(v);
g[v].push_back(u);
cnt[u]++; cnt[v]++;
}
map<int, int> MMM;
rep(i, 0, n) {
MMM[cnt[i]]++;
}
map<pair<int, int>, int> mapa;
rep(i, 0, n) {
for (int j : g[i]) {
if (i < j) {
int d1 = cnt[i], d2 = cnt[j];
if (d1 > d2) {
swap(d1, d2);
}
mapa[{d1, d2}]++;
}
}
}
map<int, int> mmm[n];
rep(i, 0, n) {
for (int j : g[i]) {
mmm[i][cnt[j]]++;
}
}
dfs(0, -1);
ll ans = 0;
rep(i, 0, n) {
for (int j : g[i]) {
if (i < j) {
if (good.count({i, j}) || good.count({j, i})) {
continue;
}
int d1 = cnt[i], d2 = cnt[j];
ll v = 0;
if (d1 - 1 == d2 - 1) {
v = 1LL * MMM[d1 - 1] * (MMM[d1 - 1] - 1) / 2;
v -= mapa[{min(d1 - 1, d2 - 1), max(d1 - 1, d2 - 1)}];
} else if (d2 - d1 == 1) {
v = 1LL * MMM[d1 - 1] * (MMM[d2 - 1] - 1);
v -= mapa[{min(d1 - 1, d2 - 1), max(d1 - 1, d2 - 1)}] - mmm[i][d1 - 1];
} else if (d1 - d2 == 1) {
v = 1LL * (MMM[d1 - 1] - 1) * MMM[d2 - 1];
v -= mapa[{min(d1 - 1, d2 - 1), max(d1 - 1, d2 - 1)}] - mmm[j][d2 - 1];
} else {
v = 1LL * MMM[d1 - 1] * MMM[d2 - 1];
v -= mapa[{min(d1 - 1, d2 - 1), max(d1 - 1, d2 - 1)}];
}
ans += v;
//cout << i << " " << j << " " << " " << v << " " << mapa[{min(d1 - 1, d2 - 1), max(d1 - 1, d2 - 1)}] << endl;
//ans += v - mapa[{min(d1 - 1, d2 - 1), max(d1 - 1, d2 - 1)}];
if (d2 - d1 == 1) {
ans += MMM[d1 - 1] - 1 - mmm[j][d1 - 1];
} else {
ans += MMM[d1 - 1] - mmm[j][d1 - 1];
}
if (d1 - d2 == 1) {
ans += MMM[d2 - 1] - 1 - mmm[i][d2 - 1];
} else {
ans += MMM[d2 - 1] - mmm[i][d2 - 1];
}
//cout << i << " " << j << " " << ans << endl;
//ans = 0;
//ans += MMM[d2 - 1] - mmm[i][d2 - 1];
//ans += MMM[d1 - 1] - mmm[j][d1 - 1];
/*MMM[d1]--;
MMM[d2]--;
MMM[d1 - 1]++;
MMM[d2 - 1]++;
MMM[d1]++;
MMM[d2]++;
MMM[d1 - 1]--;
MMM[d2 - 1]--;*/
}
}
}
cout << ans << "\n";
return 0;
}
Ly8jcHJhZ21hIGNvbW1lbnQobGlua2VyLCAiL3N0YWNrOjIwMDAwMDAwMCIpCi8vI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk9mYXN0IikKLy8jcHJhZ21hIEdDQyB0YXJnZXQoInNzZSxzc2UyLHNzZTMsc3NzZTMsc3NlNCxwb3BjbnQsYWJtLG1teCxhdngsdHVuZT1uYXRpdmUiKQovLyNwcmFnbWEgR0NDIG9wdGltaXplKCJ1bnJvbGwtbG9vcHMiKQogCiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxyYW5kb20+CiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPG1lbW9yeS5oPgogCiNkZWZpbmUgdWludCB1bnNpZ25lZCBpbnQKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSB1bGwgdW5zaWduZWQgbG9uZyBsb25nCiNkZWZpbmUgbGQgbG9uZyBkb3VibGUKI2RlZmluZSByZXAoaSwgbCwgcikgZm9yIChpbnQgaSA9IGw7IGkgPCByOyBpKyspCiNkZWZpbmUgcmVwYihpLCByLCBsKSBmb3IgKGludCBpID0gcjsgaSA+IGw7IGktLSkKI2RlZmluZSBzeihhKSAoaW50KWEuc2l6ZSgpCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBtcChhLCBiKSBtYWtlX3BhaXIoYSwgYikKIAp1c2luZyBuYW1lc3BhY2Ugc3RkOwogCmlubGluZSB2b2lkIHNldG1pbihpbnQgJngsIGludCB5KSB7IGlmICh5IDwgeCkgeCA9IHk7IH0KaW5saW5lIHZvaWQgc2V0bWF4KGludCAmeCwgaW50IHkpIHsgaWYgKHkgPiB4KSB4ID0geTsgfQppbmxpbmUgdm9pZCBzZXRtaW4obGwgJngsIGxsIHkpIHsgaWYgKHkgPCB4KSB4ID0geTsgfQppbmxpbmUgdm9pZCBzZXRtYXgobGwgJngsIGxsIHkpIHsgaWYgKHkgPiB4KSB4ID0geTsgfQogCmNvbnN0IGludCBOID0gMTAwMDAwOwpjb25zdCBpbnQgaW5mID0gKGludCkxZTkgKyAxOwpjb25zdCBsbCBiaWcgPSAobGwpMWUxOCArIDE7CmNvbnN0IGludCBQID0gMjM5Owpjb25zdCBpbnQgUDEgPSAzMTsKY29uc3QgaW50IFAyID0gNTc7CmNvbnN0IGludCBNT0QgPSAoaW50KTFlOSArIDc7CmNvbnN0IGludCBNT0QxID0gKGludCkxZTkgKyA5Owpjb25zdCBpbnQgTU9EMiA9IDk5ODI0NDM1MzsKY29uc3QgZG91YmxlIGVwcyA9IDFlLTk7CmNvbnN0IGRvdWJsZSBwaSA9IGF0YW4yKDAsIC0xKTsKY29uc3QgaW50IEFCQyA9IDI2OwogCnZlY3RvcjxpbnQ+IGdbTl07CmludCBjbnRbTl07CmJvb2wgdXNlZFtOXTsKaW50IHR0dCA9IDA7CmludCBpbltOXTsKaW50IHVwW05dOwogCnNldDxwYWlyPGludCwgaW50PiA+IGdvb2Q7CiAKdm9pZCBkZnMoaW50IHUsIGludCBwYXIpIHsKICAgIHVzZWRbdV0gPSB0cnVlOwogICAgaW5bdV0gPSB1cFt1XSA9IHR0dCsrOwogICAgZm9yIChpbnQgdiA6IGdbdV0pIHsKICAgICAgICBpZiAoIXVzZWRbdl0pIHsKICAgICAgICAgICAgZGZzKHYsIHUpOwogICAgICAgICAgICBzZXRtaW4odXBbdV0sIHVwW3ZdKTsKICAgICAgICAgICAgaWYgKHVwW3ZdID09IGluW3ZdKSB7CiAgICAgICAgICAgICAgICBnb29kLmluc2VydCh7dSwgdn0pOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKHYgIT0gcGFyKSB7CiAgICAgICAgICAgICAgICBzZXRtaW4odXBbdV0sIGluW3ZdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQogCmludCBtYWluKCkKewogICAgLy9mcmVvcGVuKCJhLmluIiwgInIiLCBzdGRpbik7CiAgICAvL2ZyZW9wZW4oImRzdS5vdXQiLCAidyIsIHN0ZG91dCk7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZSgwKTsKICAgIGNvdXQucHJlY2lzaW9uKDIwKTsKICAgIGNvdXQgPDwgZml4ZWQ7CiAgICAvL2xsIFRMID0gMC45NSAqIENMT0NLU19QRVJfU0VDOwogICAgLy9jbG9ja190IHRpbWUgPSBjbG9jaygpOwogICAgaW50IG4sbTsKICAgIGNpbiA+PiBuID4+bTsKICAgIGludCB1LCB2OwogICAgd2hpbGUgKGNpbiA+PiB1ID4+IHYpIHsKICAgICAgICB1LS07IHYtLTsKICAgICAgICBnW3VdLnB1c2hfYmFjayh2KTsKICAgICAgICBnW3ZdLnB1c2hfYmFjayh1KTsKICAgICAgICBjbnRbdV0rKzsgY250W3ZdKys7CiAgICB9CiAgICBtYXA8aW50LCBpbnQ+IE1NTTsKICAgIHJlcChpLCAwLCBuKSB7CiAgICAgICAgTU1NW2NudFtpXV0rKzsKICAgIH0KICAgIG1hcDxwYWlyPGludCwgaW50PiwgaW50PiBtYXBhOwogICAgcmVwKGksIDAsIG4pIHsKICAgICAgICBmb3IgKGludCBqIDogZ1tpXSkgewogICAgICAgICAgICBpZiAoaSA8IGopIHsKICAgICAgICAgICAgICAgIGludCBkMSA9IGNudFtpXSwgZDIgPSBjbnRbal07CiAgICAgICAgICAgICAgICBpZiAoZDEgPiBkMikgewogICAgICAgICAgICAgICAgICAgIHN3YXAoZDEsIGQyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcGFbe2QxLCBkMn1dKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBtYXA8aW50LCBpbnQ+IG1tbVtuXTsKICAgIHJlcChpLCAwLCBuKSB7CiAgICAgICAgZm9yIChpbnQgaiA6IGdbaV0pIHsKICAgICAgICAgICAgbW1tW2ldW2NudFtqXV0rKzsKICAgICAgICB9CiAgICB9CiAgICBkZnMoMCwgLTEpOwogICAgbGwgYW5zID0gMDsKICAgIHJlcChpLCAwLCBuKSB7CiAgICAgICAgZm9yIChpbnQgaiA6IGdbaV0pIHsKICAgICAgICAgICAgaWYgKGkgPCBqKSB7CiAgICAgICAgICAgICAgICBpZiAoZ29vZC5jb3VudCh7aSwgan0pIHx8IGdvb2QuY291bnQoe2osIGl9KSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW50IGQxID0gY250W2ldLCBkMiA9IGNudFtqXTsKICAgICAgICAgICAgICAgIGxsIHYgPSAwOwogICAgICAgICAgICAgICAgaWYgKGQxIC0gMSA9PSBkMiAtIDEpIHsKICAgICAgICAgICAgICAgICAgICB2ID0gMUxMICogTU1NW2QxIC0gMV0gKiAoTU1NW2QxIC0gMV0gLSAxKSAvIDI7CiAgICAgICAgICAgICAgICAgICAgdiAtPSBtYXBhW3ttaW4oZDEgLSAxLCBkMiAtIDEpLCBtYXgoZDEgLSAxLCBkMiAtIDEpfV07CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGQyIC0gZDEgPT0gMSkgewogICAgICAgICAgICAgICAgICAgIHYgPSAxTEwgKiBNTU1bZDEgLSAxXSAqIChNTU1bZDIgLSAxXSAtIDEpOwogICAgICAgICAgICAgICAgICAgIHYgLT0gbWFwYVt7bWluKGQxIC0gMSwgZDIgLSAxKSwgbWF4KGQxIC0gMSwgZDIgLSAxKX1dIC0gbW1tW2ldW2QxIC0gMV07CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGQxIC0gZDIgPT0gMSkgewogICAgICAgICAgICAgICAgICAgIHYgPSAxTEwgKiAoTU1NW2QxIC0gMV0gLSAxKSAqIE1NTVtkMiAtIDFdOwogICAgICAgICAgICAgICAgICAgIHYgLT0gbWFwYVt7bWluKGQxIC0gMSwgZDIgLSAxKSwgbWF4KGQxIC0gMSwgZDIgLSAxKX1dIC0gbW1tW2pdW2QyIC0gMV07CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHYgPSAxTEwgKiBNTU1bZDEgLSAxXSAqIE1NTVtkMiAtIDFdOwogICAgICAgICAgICAgICAgICAgIHYgLT0gbWFwYVt7bWluKGQxIC0gMSwgZDIgLSAxKSwgbWF4KGQxIC0gMSwgZDIgLSAxKX1dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYW5zICs9IHY7CiAgICAgICAgICAgICAgICAvL2NvdXQgPDwgaSA8PCAiICIgPDwgaiA8PCAiICIgPDwgIiAiIDw8IHYgPDwgIiAiIDw8IG1hcGFbe21pbihkMSAtIDEsIGQyIC0gMSksIG1heChkMSAtIDEsIGQyIC0gMSl9XSA8PCBlbmRsOwogICAgICAgICAgICAgICAgLy9hbnMgKz0gdiAtIG1hcGFbe21pbihkMSAtIDEsIGQyIC0gMSksIG1heChkMSAtIDEsIGQyIC0gMSl9XTsKICAgICAgICAgICAgICAgIGlmIChkMiAtIGQxID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBhbnMgKz0gTU1NW2QxIC0gMV0gLSAxIC0gbW1tW2pdW2QxIC0gMV07CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGFucyArPSBNTU1bZDEgLSAxXSAtIG1tbVtqXVtkMSAtIDFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGQxIC0gZDIgPT0gMSkgewogICAgICAgICAgICAgICAgICAgIGFucyArPSBNTU1bZDIgLSAxXSAtIDEgLSBtbW1baV1bZDIgLSAxXTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgYW5zICs9IE1NTVtkMiAtIDFdIC0gbW1tW2ldW2QyIC0gMV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvL2NvdXQgPDwgaSA8PCAiICIgPDwgaiA8PCAiICIgPDwgYW5zIDw8IGVuZGw7CiAgICAgICAgICAgICAgICAvL2FucyA9IDA7CiAgICAgICAgICAgICAgICAvL2FucyArPSBNTU1bZDIgLSAxXSAtIG1tbVtpXVtkMiAtIDFdOwogICAgICAgICAgICAgICAgLy9hbnMgKz0gTU1NW2QxIC0gMV0gLSBtbW1bal1bZDEgLSAxXTsKICAgICAgICAgICAgICAgIC8qTU1NW2QxXS0tOwogICAgICAgICAgICAgICAgTU1NW2QyXS0tOwogICAgICAgICAgICAgICAgTU1NW2QxIC0gMV0rKzsKICAgICAgICAgICAgICAgIE1NTVtkMiAtIDFdKys7CiAgICAgICAgICAgICAgICBNTU1bZDFdKys7CiAgICAgICAgICAgICAgICBNTU1bZDJdKys7CiAgICAgICAgICAgICAgICBNTU1bZDEgLSAxXS0tOwogICAgICAgICAgICAgICAgTU1NW2QyIC0gMV0tLTsqLwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgY291dCA8PCBhbnMgPDwgIlxuIjsKICAgIHJldHVybiAwOwp9IA==