#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("-O3")
struct vertex {
  bool vis = false;
  vector<pair<long long int, long long int> > adj;
  long long int low = 1000000007;
  long long int dp = 0;
  long long int parent = -1;
};
long long int tim = 0, n, m;
vector<pair<long long int, long long int> > edges;
bool flag = false;
void dfs(vertex x[], long long int sor) {
  x[sor].vis = true;
  tim++;
  x[sor].dp = tim;
  x[sor].low = tim;
  for (auto y : x[sor].adj) {
    if (!x[y.first].vis) {
      x[y.first].parent = sor;
      dfs(x, y.first);
      x[sor].low = min(x[sor].low, x[y.first].low);
      if (x[y.first].low > x[sor].dp)
        flag = true;
      else
        edges[y.second] = {sor, y.first};
    } else if (y.first != x[sor].parent) {
      x[sor].low = min(x[sor].low, x[y.first].dp);
      if (x[y.first].dp < x[sor].dp) {
        edges[y.second] = {sor, y.first};
      }
    }
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  vertex x[n];
  for (long long int a = 0; a < m; a++) {
    long long int u, v;
    cin >> u >> v;
    u--, v--;
    x[u].adj.push_back({v, a});
    x[v].adj.push_back({u, a});
    edges.push_back({u, v});
  }
  dfs(x, 0);
  if (flag)
    cout << 0 << endl;
  else
    for (auto y : edges) cout << y.first + 1 << " " << y.second + 1 << endl;
  return 0;
}
