#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
const int MAXN = 100005;
vector<int> adj[MAXN];
bool visited[MAXN];
int tin[MAXN], low[MAXN], timer;
set<pair<int, int>> bridges;
bool dfsCheck(int u, int target) {
visited[u] = true;
if (u == target) return true;
for (int v : adj[u]) {
if (!visited[v] && dfsCheck(v, target)) return true;
}
return false;
}
vector<pair<int, int>> tim_canh_cau(int n) {
vector<pair<int, int>> bridgeEdges;
set<pair<int, int>> checkedEdges;
for (int u = 1; u <= n; ++u) {
for (int v : adj[u]) {
if (u < v && checkedEdges.find({u, v}) == checkedEdges.end()) {
checkedEdges.insert({u, v});
adj[u].erase(remove(adj[u].begin(), adj[u].end(), v), adj[u].end());
adj[v].erase(remove(adj[v].begin(), adj[v].end(), u), adj[v].end());
fill(visited, visited + n + 1, false);
if (!dfsCheck(u, v)) {
bridgeEdges.emplace_back(u, v);
}
adj[u].push_back(v);
adj[v].push_back(u);
}
}
}
return bridgeEdges;
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
vector<pair<int, int>> bridges = tim_canh_cau(n);
cout << bridges.size() << endl;
for (auto [u, v] : bridges) {
cout << u << " " << v << endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBNQVhOID0gMTAwMDA1Owp2ZWN0b3I8aW50PiBhZGpbTUFYTl07CmJvb2wgdmlzaXRlZFtNQVhOXTsKaW50IHRpbltNQVhOXSwgbG93W01BWE5dLCB0aW1lcjsKc2V0PHBhaXI8aW50LCBpbnQ+PiBicmlkZ2VzOwoKYm9vbCBkZnNDaGVjayhpbnQgdSwgaW50IHRhcmdldCkgewogICAgdmlzaXRlZFt1XSA9IHRydWU7CiAgICBpZiAodSA9PSB0YXJnZXQpIHJldHVybiB0cnVlOwogICAgZm9yIChpbnQgdiA6IGFkalt1XSkgewogICAgICAgIGlmICghdmlzaXRlZFt2XSAmJiBkZnNDaGVjayh2LCB0YXJnZXQpKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKdmVjdG9yPHBhaXI8aW50LCBpbnQ+PiB0aW1fY2FuaF9jYXUoaW50IG4pIHsKICAgIHZlY3RvcjxwYWlyPGludCwgaW50Pj4gYnJpZGdlRWRnZXM7CiAgICBzZXQ8cGFpcjxpbnQsIGludD4+IGNoZWNrZWRFZGdlczsKICAgIGZvciAoaW50IHUgPSAxOyB1IDw9IG47ICsrdSkgewogICAgICAgIGZvciAoaW50IHYgOiBhZGpbdV0pIHsKICAgICAgICAgICAgaWYgKHUgPCB2ICYmIGNoZWNrZWRFZGdlcy5maW5kKHt1LCB2fSkgPT0gY2hlY2tlZEVkZ2VzLmVuZCgpKSB7CiAgICAgICAgICAgICAgICBjaGVja2VkRWRnZXMuaW5zZXJ0KHt1LCB2fSk7CiAgICAgICAgICAgICAgICBhZGpbdV0uZXJhc2UocmVtb3ZlKGFkalt1XS5iZWdpbigpLCBhZGpbdV0uZW5kKCksIHYpLCBhZGpbdV0uZW5kKCkpOwogICAgICAgICAgICAgICAgYWRqW3ZdLmVyYXNlKHJlbW92ZShhZGpbdl0uYmVnaW4oKSwgYWRqW3ZdLmVuZCgpLCB1KSwgYWRqW3ZdLmVuZCgpKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZmlsbCh2aXNpdGVkLCB2aXNpdGVkICsgbiArIDEsIGZhbHNlKTsKICAgICAgICAgICAgICAgIGlmICghZGZzQ2hlY2sodSwgdikpIHsKICAgICAgICAgICAgICAgICAgICBicmlkZ2VFZGdlcy5lbXBsYWNlX2JhY2sodSwgdik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGFkalt1XS5wdXNoX2JhY2sodik7CiAgICAgICAgICAgICAgICBhZGpbdl0ucHVzaF9iYWNrKHUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGJyaWRnZUVkZ2VzOwp9CgppbnQgbWFpbigpIHsKICAgIGludCBuLCBtOwogICAgY2luID4+IG4gPj4gbTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CiAgICAgICAgaW50IHUsIHY7CiAgICAgICAgY2luID4+IHUgPj4gdjsKICAgICAgICBhZGpbdV0ucHVzaF9iYWNrKHYpOwogICAgICAgIGFkalt2XS5wdXNoX2JhY2sodSk7CiAgICB9CiAgICAKICAgIHZlY3RvcjxwYWlyPGludCwgaW50Pj4gYnJpZGdlcyA9IHRpbV9jYW5oX2NhdShuKTsKICAgIGNvdXQgPDwgYnJpZGdlcy5zaXplKCkgPDwgZW5kbDsKICAgIGZvciAoYXV0byBbdSwgdl0gOiBicmlkZ2VzKSB7CiAgICAgICAgY291dCA8PCB1IDw8ICIgIiA8PCB2IDw8IGVuZGw7CiAgICB9CiAgICAKICAgIHJldHVybiAwOwp9Cg==