#include <bits/stdc++.h>
using namespace std;
const int N = 100000;
const int M = 300000;
int n, m;
vector<array<int, 2>> adj[N + 10];
vector<array<int, 3>> edge;
vector<bool> vis;
vector<int> tin, low;
int timer;
bool flag = true;
void Tarjan(int u, int p = -1) {
  vis[u] = true;
  tin[u] = low[u] = timer++;
  for (auto e : adj[u]) {
    int v = e[0];
    if (p == v) continue;
    if (vis[v]) {
      low[u] = min(low[u], low[v]);
      if (tin[v] > tin[u] && v != edge[e[1]][0]) edge[e[1]][2] = 1;
    } else {
      Tarjan(v, u);
      low[u] = min(low[u], low[v]);
      if (low[v] > tin[u]) {
        flag = false;
      }
      if (tin[v] > tin[u] && v != edge[e[1]][1]) edge[e[1]][2] = 1;
    }
  }
}
int main() {
  ios::sync_with_stdio(0);
  cin >> n >> m;
  vis.assign(n + 1, false);
  tin.assign(n + 1, -1);
  low.assign(n + 1, -1);
  for (int i = 0; i < m; ++i) {
    int a, b;
    cin >> a >> b;
    adj[a].push_back({b, i});
    adj[b].push_back({a, i});
    edge.push_back({a, b, 0});
  }
  Tarjan(1);
  if (!flag) {
    cout << 0;
  } else {
    for (auto e : edge) {
      if (e[2] == 1) {
        cout << e[1] << " " << e[0] << "\n";
      } else {
        cout << e[0] << " " << e[1] << "\n";
      }
    }
  }
  return 0;
}
