int n, m, u[maxn], v[maxn], deg[maxn], vis[maxn]; vector<int> edge[maxn];
intmain(){ while (~scanf("%d%d", &n, &m)) { ms(vis, 0); ms(deg, 0); for (int i = 0; i <= n; i++) edge[i].clear(); for (int i = 0; i < m; i++) { scanf("%d%d", u + i, v + i); deg[u[i]]++; deg[v[i]]++; } for (int i = 0; i < m; i++) { if (deg[u[i]] != deg[v[i]]) { if (deg[u[i]] < deg[v[i]]) swap(u[i], v[i]); } else { if (u[i] > v[i]) swap(u[i], v[i]); } edge[u[i]].push_back(v[i]); } ll ans = 0; map<PII,int> mp; for (int i = 1; i <= n; i++) { for (int v: edge[i]) vis[v] = i; for (int v: edge[i]) { for (int u: edge[v]) if (vis[u] == i) { int a[3] = {i, u, v}; sort(a, a + 3); mp[{a[0], a[1]}]++; mp[{a[0], a[2]}]++; mp[{a[1], a[2]}]++; } } } for (auto& x: mp) { dbg(x.second); ans += 1ll * x.second * (x.second - 1) / 2; } printf("%lld\n", ans); } return0; }