-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
-
38
-
39
-
40
-
41
-
42
#include <bits/stdc++.h>
#define f first
#define s second
#define pb push_back
#define eb emplace_back
using namespace std;
using ll = long long;
using ii = pair<int, int>;
using vi = vector<int>;
using vii = vector<ii>;
ii E[100001];
vi G[100001];
bitset<100001> vis, oc;
int main() {
int N, M;
cin >> N >> M;
for (int i = 0; i < M; ++i) {
cin >> E[i].f >> E[i].s;
G[E[i].f].pb(E[i].s), G[E[i].s].pb(E[i].f);
}
vi v;
for (int i = 1; i <= N; ++i) v.push_back(i);
sort(begin(v), end(v), [](int a, int b) { return G[a].size() < G[b].size(); });
ll ans = 0;
for (auto& u : v) {
vis[u] = 1;
for (auto& v : G[u]) oc[v] = 1;
vi tmp;
for (auto& v : G[u]) {
if (vis[v]) tmp.pb(v);
}
for (auto& v : tmp) {
for (auto& w : G[v]) ans += oc[w];
}
for (auto& v : G[u]) oc[v] = 0;
}
cout << ans / 3 << '\n';
}