/*
-------------- | /
| | /
| | /
| * |/ | | ------ *
| | | | / \
| | |\ | | | |\ |
\ | | | \ | | | | \ |
\ | | | \ | | \ / \ |
V | | \ \__/| ----- \ |
*/
#include <bits/stdc++.h>
using namespace std;
#ifdef EMT
#define debug(x) cerr << "\e[1;31m" << #x << " = " << (x) << "\e[0m\n"
#define print(x) emilia_mata_tenshi(#x, begin(x), end(x))
template<typename T, typename T2> ostream& operator<<(ostream &os, const pair<T, T2> &obj) {
return os << '{' << obj.first << ',' << obj.second << '}';
}
template<class TupType, size_t... I> void lamy_kawaii(ostream& os, const TupType& _tup, index_sequence<I...>) {
// source: https://stackoverflow.com/a/41171552
os << '{';
(..., (cerr << (I == 0? "" : ",") << get<I>(_tup)));
os << '}';
}
template<class... T> ostream& operator<<(ostream &os, const tuple<T...>& _tup) {
lamy_kawaii(os, _tup, make_index_sequence<sizeof...(T)>());
return os;
}
template<typename T> void emilia_mata_tenshi(const char *s, T l, T r) {
cerr << "\e[1;33m" << s << " = [";
while(l != r) {
cerr << *l;
cerr << (++l == r ? ']' : ',');
}
cerr << "\e[0m\n";
}
#else
#define debug(x) 48763
#define print(x) 48763
#endif
template<typename T, typename T2> istream& operator>>(istream &is, pair<T, T2> &obj) {
is >> obj.first >> obj.second;
return is;
}
template<typename T> istream& operator>>(istream &is, vector<T> &obj) {
for(auto &x : obj)
is >> x;
return is;
}
#define YN(x) ((x) ? "YES" : "NO")
#define yn(x) ((x) ? "Yes" : "No")
#define EmiliaMyWife ios::sync_with_stdio(0); cin.tie(NULL);
using ll = int64_t;
using ull = uint64_t;
using ld = long double;
using uint = uint32_t;
const double EPS = 1e-8;
const int INF = 0x3F3F3F3F;
const ll LINF = 4611686018427387903;
const int MOD = 1e9+7;
static int Lamy_is_cute = []() {
EmiliaMyWife
return 48763;
}();
/*--------------------------------------------------------------------------------------*/
struct find_bridges {
int n, t;
vector<vector<int>> edge;
vector<bool> is;
vector<pair<int, int>> edges;
vector<int> tim, low;
find_bridges() { }
find_bridges(int _n) {
n = _n;
t = 1;
edge.resize(n);
tim.resize(n);
low.resize(n);
}
void add_edge(int u, int v) {
if(u != v) {
edge[u].push_back(edges.size());
edge[v].push_back(edges.size());
}
is.push_back(false);
edges.push_back({u, v});
}
void dfs(int u, int p = -1) {
tim[u] = low[u] = t++;
for(int i : edge[u]) {
if(i == p)
continue;
int v = edges[i].first;
if(v == u)
v = edges[i].second;
if(tim[v])
low[u] = min(low[u], tim[v]);
else {
dfs(v, i);
if(low[v] > tim[u])
is[i] = true;
low[u] = min(low[u], low[v]);
}
}
}
int find() {
for(int i = 0; i < n; i++)
if(!tim[i])
dfs(i);
int ans = 0;
for(int i = 0; i < edges.size(); i++)
ans += is[i];
return ans;
}
inline bool is_edge(int x) { return is[x]; }
};
signed main() {
int n, m;
cin >> n >> m;
auto bri = find_bridges(n);
for(int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
bri.add_edge(u - 1, v - 1);
}
cout << bri.find() << '\n';
}
LyoKLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgIHwgICAvCiAgICAgIHwgICAgICAgICAgICAgICAgICAgICB8ICAvCiAgICAgIHwgICAgICAgICAgICAgICAgICAgICB8IC8KICAgICAgfCAgICAgICAgICAgICAqICAgICAgIHwvICAgICAgICAgIHwgICAgfCAgICAgICAgIC0tLS0tLSAgICAgICAgICAgICoKICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgfCAgICAgICAgLyAgICAgIFwKICAgICAgfCAgICAgICAgICAgICB8ICAgICAgIHxcICAgICAgICAgIHwgICAgfCAgICAgICB8ICAgICAgIHxcICAgICAgICAgIHwKICAgXCAgfCAgICAgICAgICAgICB8ICAgICAgIHwgXCAgICAgICAgIHwgICAgfCAgICAgICB8ICAgICAgIHwgXCAgICAgICAgIHwKICAgIFwgfCAgICAgICAgICAgICB8ICAgICAgIHwgIFwgICAgICAgIHwgICAgfCAgICAgICAgXCAgICAgLyAgIFwgICAgICAgIHwKICAgICBWICAgICAgICAgICAgICB8ICAgICAgIHwgICBcICAgICAgICBcX18vfCAgICAgICAgIC0tLS0tICAgICBcICAgICAgIHwKKi8KI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojaWZkZWYgRU1UCiNkZWZpbmUgZGVidWcoeCkgY2VyciA8PCAiXGVbMTszMW0iIDw8ICN4IDw8ICIgPSAiIDw8ICh4KSA8PCAiXGVbMG1cbiIKI2RlZmluZSBwcmludCh4KSBlbWlsaWFfbWF0YV90ZW5zaGkoI3gsIGJlZ2luKHgpLCBlbmQoeCkpCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFQyPiBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0gJm9zLCBjb25zdCBwYWlyPFQsIFQyPiAmb2JqKSB7CglyZXR1cm4gb3MgPDwgJ3snIDw8IG9iai5maXJzdCA8PCAnLCcgPDwgb2JqLnNlY29uZCA8PCAnfSc7Cn0KdGVtcGxhdGU8Y2xhc3MgVHVwVHlwZSwgc2l6ZV90Li4uIEk+IHZvaWQgbGFteV9rYXdhaWkob3N0cmVhbSYgb3MsIGNvbnN0IFR1cFR5cGUmIF90dXAsIGluZGV4X3NlcXVlbmNlPEkuLi4+KSB7CgkvLyBzb3VyY2U6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80MTE3MTU1MgoJb3MgPDwgJ3snOwoJKC4uLiwgKGNlcnIgPDwgKEkgPT0gMD8gIiIgOiAiLCIpIDw8IGdldDxJPihfdHVwKSkpOwoJb3MgPDwgJ30nOwp9CnRlbXBsYXRlPGNsYXNzLi4uIFQ+IG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSAmb3MsIGNvbnN0IHR1cGxlPFQuLi4+JiBfdHVwKSB7CglsYW15X2thd2FpaShvcywgX3R1cCwgbWFrZV9pbmRleF9zZXF1ZW5jZTxzaXplb2YuLi4oVCk+KCkpOwoJcmV0dXJuIG9zOwp9CnRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgZW1pbGlhX21hdGFfdGVuc2hpKGNvbnN0IGNoYXIgKnMsIFQgbCwgVCByKSB7CgljZXJyIDw8ICJcZVsxOzMzbSIgPDwgcyA8PCAiID0gWyI7Cgl3aGlsZShsICE9IHIpIHsKCQljZXJyIDw8ICpsOwoJCWNlcnIgPDwgKCsrbCA9PSByID8gJ10nIDogJywnKTsKCX0KCWNlcnIgPDwgIlxlWzBtXG4iOwp9CiNlbHNlCiNkZWZpbmUgZGVidWcoeCkgNDg3NjMKI2RlZmluZSBwcmludCh4KSA0ODc2MwojZW5kaWYKCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFQyPiBpc3RyZWFtJiBvcGVyYXRvcj4+KGlzdHJlYW0gJmlzLCBwYWlyPFQsIFQyPiAmb2JqKSB7CglpcyA+PiBvYmouZmlyc3QgPj4gb2JqLnNlY29uZDsKCXJldHVybiBpczsKfQp0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpc3RyZWFtJiBvcGVyYXRvcj4+KGlzdHJlYW0gJmlzLCB2ZWN0b3I8VD4gJm9iaikgewoJZm9yKGF1dG8gJnggOiBvYmopCgkJaXMgPj4geDsKCXJldHVybiBpczsKfQoKI2RlZmluZSBZTih4KSAoKHgpID8gIllFUyIgOiAiTk8iKQojZGVmaW5lIHluKHgpICgoeCkgPyAiWWVzIiA6ICJObyIpCiNkZWZpbmUgRW1pbGlhTXlXaWZlIGlvczo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKE5VTEwpOwp1c2luZyBsbCA9IGludDY0X3Q7CnVzaW5nIHVsbCA9IHVpbnQ2NF90Owp1c2luZyBsZCA9IGxvbmcgZG91YmxlOwp1c2luZyB1aW50ID0gdWludDMyX3Q7CmNvbnN0IGRvdWJsZSBFUFMgID0gMWUtODsKY29uc3QgaW50IElORiAgICAgPSAweDNGM0YzRjNGOwpjb25zdCBsbCBMSU5GICAgICA9IDQ2MTE2ODYwMTg0MjczODc5MDM7CmNvbnN0IGludCBNT0QgICAgID0gMWU5Kzc7CnN0YXRpYyBpbnQgTGFteV9pc19jdXRlID0gW10oKSB7CglFbWlsaWFNeVdpZmUKCXJldHVybiA0ODc2MzsKfSgpOwovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCnN0cnVjdCBmaW5kX2JyaWRnZXMgewoJaW50IG4sIHQ7Cgl2ZWN0b3I8dmVjdG9yPGludD4+IGVkZ2U7Cgl2ZWN0b3I8Ym9vbD4gaXM7Cgl2ZWN0b3I8cGFpcjxpbnQsIGludD4+IGVkZ2VzOwoJdmVjdG9yPGludD4gdGltLCBsb3c7CglmaW5kX2JyaWRnZXMoKSB7IH0KCWZpbmRfYnJpZGdlcyhpbnQgX24pIHsKCQluID0gX247CgkJdCA9IDE7CgkJZWRnZS5yZXNpemUobik7CgkJdGltLnJlc2l6ZShuKTsKCQlsb3cucmVzaXplKG4pOwoJfQoJdm9pZCBhZGRfZWRnZShpbnQgdSwgaW50IHYpIHsKCQlpZih1ICE9IHYpIHsKCQkJZWRnZVt1XS5wdXNoX2JhY2soZWRnZXMuc2l6ZSgpKTsKCQkJZWRnZVt2XS5wdXNoX2JhY2soZWRnZXMuc2l6ZSgpKTsKCQl9CgkJaXMucHVzaF9iYWNrKGZhbHNlKTsKCQllZGdlcy5wdXNoX2JhY2soe3UsIHZ9KTsKCX0KCXZvaWQgZGZzKGludCB1LCBpbnQgcCA9IC0xKSB7CgkJdGltW3VdID0gbG93W3VdID0gdCsrOwoJCWZvcihpbnQgaSA6IGVkZ2VbdV0pIHsKCQkJaWYoaSA9PSBwKQoJCQkJY29udGludWU7CgkJCWludCB2ID0gZWRnZXNbaV0uZmlyc3Q7CgkJCWlmKHYgPT0gdSkKCQkJCXYgPSBlZGdlc1tpXS5zZWNvbmQ7CgkJCWlmKHRpbVt2XSkKCQkJCWxvd1t1XSA9IG1pbihsb3dbdV0sIHRpbVt2XSk7CgkJCWVsc2UgewoJCQkJZGZzKHYsIGkpOwoJCQkJaWYobG93W3ZdID4gdGltW3VdKQoJCQkJCWlzW2ldID0gdHJ1ZTsKCQkJCWxvd1t1XSA9IG1pbihsb3dbdV0sIGxvd1t2XSk7CgkJCX0KCQl9Cgl9CglpbnQgZmluZCgpIHsKCQlmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQoJCQlpZighdGltW2ldKQoJCQkJZGZzKGkpOwoJCWludCBhbnMgPSAwOwoJCWZvcihpbnQgaSA9IDA7IGkgPCBlZGdlcy5zaXplKCk7IGkrKykKCQkJYW5zICs9IGlzW2ldOwoJCXJldHVybiBhbnM7Cgl9CglpbmxpbmUgYm9vbCBpc19lZGdlKGludCB4KSB7IHJldHVybiBpc1t4XTsgfQp9OwoKc2lnbmVkIG1haW4oKSB7CglpbnQgbiwgbTsKCWNpbiA+PiBuID4+IG07CglhdXRvIGJyaSA9IGZpbmRfYnJpZGdlcyhuKTsKCWZvcihpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKCQlpbnQgdSwgdjsKCQljaW4gPj4gdSA+PiB2OwoJCWJyaS5hZGRfZWRnZSh1IC0gMSwgdiAtIDEpOwoJfQoJY291dCA8PCBicmkuZmluZCgpIDw8ICdcbic7Cn0K