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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <bits/stdc++.h>
using namespace std;

typedef unsigned long long ull;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> PII;
typedef pair<ll, int> PILL;
typedef pair<ll, ll> PLL;

const int MAX_N = 2e5+5;
const int M = 3e4+5;
const ll INF = (ll)(1e18);
const int inf = 2e9;
const ll MOD = 1000000007LL;

int n, m;
vector<PII> G[MAX_N];	// (to, id)
bool vis[MAX_N];
bool deletedEdges[2*MAX_N];
int nodeCnt = 0;

void dfs(int v) {
	vis[v] = true;
	nodeCnt++;
	for (PII e: G[v]) {
		int to = e.first;
		int id = e.second;
		if (vis[to] || deletedEdges[id]) continue;
		dfs(to);
	}
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
	
	cin >> n >> m;
	for (int id = 1; id <= m; id++) {
		int u, v;
		cin >> u >> v;
		G[u].emplace_back(v, id);
		G[v].emplace_back(u, id);
	}
	
	int ans = 0;
	for (int i = 1; i <= m-2; i++) {
		for (int j = i+1; j <= m-1; j++) {
			for (int k = j+1; k <= m; k++) {
				deletedEdges[i] = deletedEdges[j] = deletedEdges[k] = true;
				for (int v = 1; v <= n; v++) {
					vis[v] = false;
				}
				nodeCnt = 0;
				dfs(1);
				if (nodeCnt < n) ans++;
				deletedEdges[i] = deletedEdges[j] = deletedEdges[k] = false;
			}
		}
	}
	
	cout << ans << '\n';
	
	
    return 0;
}