#include <bits/stdc++.h>
using namespace std;
static const int MAXN = 100000;
static const int MAXM = 300000;
int n, m;
vector<pair<int,int>> adj[MAXN+1]; // (neighbor, edge_id)
int tin[MAXN+1], low[MAXN+1], timer = 1;
bool isBridge[MAXM];
bool used_edge[MAXM];
bool vis[MAXN+1];
pair<int,int> answer[MAXM];
// 1) Find all bridges
void dfsBridge(int u, int pe) {
tin[u] = low[u] = timer++;
for (auto &pr : adj[u]) {
int v = pr.first, id = pr.second;
if (id == pe) continue;
if (!tin[v]) {
dfsBridge(v, id);
low[u] = min(low[u], low[v]);
if (low[v] > tin[u]) {
isBridge[id] = true;
}
} else {
low[u] = min(low[u], tin[v]);
}
}
}
// 2) Orient every edge in a single DFS
void dfsOrient(int u) {
vis[u] = true;
for (auto &pr : adj[u]) {
int v = pr.first, id = pr.second;
if (used_edge[id]) continue;
used_edge[id] = true;
// orient u -> v
answer[id] = {u, v};
if (!vis[v]) {
dfsOrient(v);
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
for(int i = 0; i < m; i++){
int a, b;
cin >> a >> b;
adj[a].emplace_back(b,i);
adj[b].emplace_back(a,i);
}
// 1) Bridge‐find
dfsBridge(1, -1);
// 2) If any bridge, no strongly‐connected orientation exists
for(int id = 0; id < m; id++){
if(isBridge[id]){
cout << 0 << "\n";
return 0;
}
}
// 3) Orient all edges
dfsOrient(1);
// 4) Output all m oriented edges
// in input order (edge IDs 0..m-1)
for(int id = 0; id < m; id++){
cout << answer[id].first
<< " "
<< answer[id].second
<< "\n";
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdGF0aWMgY29uc3QgaW50IE1BWE4gPSAxMDAwMDA7CnN0YXRpYyBjb25zdCBpbnQgTUFYTSA9IDMwMDAwMDsKCmludCBuLCBtOwp2ZWN0b3I8cGFpcjxpbnQsaW50Pj4gYWRqW01BWE4rMV07IC8vIChuZWlnaGJvciwgZWRnZV9pZCkKaW50IHRpbltNQVhOKzFdLCBsb3dbTUFYTisxXSwgdGltZXIgPSAxOwpib29sIGlzQnJpZGdlW01BWE1dOwpib29sIHVzZWRfZWRnZVtNQVhNXTsKYm9vbCB2aXNbTUFYTisxXTsKcGFpcjxpbnQsaW50PiBhbnN3ZXJbTUFYTV07CgovLyAxKSBGaW5kIGFsbCBicmlkZ2VzCnZvaWQgZGZzQnJpZGdlKGludCB1LCBpbnQgcGUpIHsKICAgIHRpblt1XSA9IGxvd1t1XSA9IHRpbWVyKys7CiAgICBmb3IgKGF1dG8gJnByIDogYWRqW3VdKSB7CiAgICAgICAgaW50IHYgPSBwci5maXJzdCwgaWQgPSBwci5zZWNvbmQ7CiAgICAgICAgaWYgKGlkID09IHBlKSBjb250aW51ZTsKICAgICAgICBpZiAoIXRpblt2XSkgewogICAgICAgICAgICBkZnNCcmlkZ2UodiwgaWQpOwogICAgICAgICAgICBsb3dbdV0gPSBtaW4obG93W3VdLCBsb3dbdl0pOwogICAgICAgICAgICBpZiAobG93W3ZdID4gdGluW3VdKSB7CiAgICAgICAgICAgICAgICBpc0JyaWRnZVtpZF0gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbG93W3VdID0gbWluKGxvd1t1XSwgdGluW3ZdKTsKICAgICAgICB9CiAgICB9Cn0KCi8vIDIpIE9yaWVudCBldmVyeSBlZGdlIGluIGEgc2luZ2xlIERGUwp2b2lkIGRmc09yaWVudChpbnQgdSkgewogICAgdmlzW3VdID0gdHJ1ZTsKICAgIGZvciAoYXV0byAmcHIgOiBhZGpbdV0pIHsKICAgICAgICBpbnQgdiA9IHByLmZpcnN0LCBpZCA9IHByLnNlY29uZDsKICAgICAgICBpZiAodXNlZF9lZGdlW2lkXSkgY29udGludWU7CiAgICAgICAgdXNlZF9lZGdlW2lkXSA9IHRydWU7CiAgICAgICAgLy8gb3JpZW50IHUgLT4gdgogICAgICAgIGFuc3dlcltpZF0gPSB7dSwgdn07CiAgICAgICAgaWYgKCF2aXNbdl0pIHsKICAgICAgICAgICAgZGZzT3JpZW50KHYpOwogICAgICAgIH0KICAgIH0KfQoKaW50IG1haW4oKXsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CgogICAgY2luID4+IG4gPj4gbTsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBtOyBpKyspewogICAgICAgIGludCBhLCBiOwogICAgICAgIGNpbiA+PiBhID4+IGI7CiAgICAgICAgYWRqW2FdLmVtcGxhY2VfYmFjayhiLGkpOwogICAgICAgIGFkaltiXS5lbXBsYWNlX2JhY2soYSxpKTsKICAgIH0KICAgIC8vIDEpIEJyaWRnZeKAkGZpbmQKICAgIGRmc0JyaWRnZSgxLCAtMSk7CgogICAgLy8gMikgSWYgYW55IGJyaWRnZSwgbm8gc3Ryb25nbHnigJBjb25uZWN0ZWQgb3JpZW50YXRpb24gZXhpc3RzCiAgICBmb3IoaW50IGlkID0gMDsgaWQgPCBtOyBpZCsrKXsKICAgICAgICBpZihpc0JyaWRnZVtpZF0pewogICAgICAgICAgICBjb3V0IDw8IDAgPDwgIlxuIjsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIC8vIDMpIE9yaWVudCBhbGwgZWRnZXMKICAgIGRmc09yaWVudCgxKTsKCiAgICAvLyA0KSBPdXRwdXQgYWxsIG0gb3JpZW50ZWQgZWRnZXMKICAgIC8vICAgIGluIGlucHV0IG9yZGVyIChlZGdlIElEcyAwLi5tLTEpCiAgICBmb3IoaW50IGlkID0gMDsgaWQgPCBtOyBpZCsrKXsKICAgICAgICBjb3V0IDw8IGFuc3dlcltpZF0uZmlyc3QKICAgICAgICAgICAgIDw8ICIgIiAKICAgICAgICAgICAgIDw8IGFuc3dlcltpZF0uc2Vjb25kCiAgICAgICAgICAgICA8PCAiXG4iOwogICAgfQogICAgcmV0dXJuIDA7Cn0K