#include <bits/stdc++.h>
using namespace std;
struct edge {
  edge(int to, int back, int orient = 0) : to(to), back(back), orient(orient) {}
  int to;
  int back;
  int orient;
};
class Tarjan {
 public:
  vector<vector<int> > adj;
  vector<int> comp;
  int nb_cfc;

 private:
  vector<int> index;
  vector<int> lowlink;
  stack<int> s;
  int id;
  void tarjan(int i) {
    int j, k;
    index[i] = id;
    lowlink[i] = id;
    ++id;
    s.push(i);
    for (k = 0; k < (int)adj[i].size(); ++k) {
      j = adj[i][k];
      if (index[j] == -1) tarjan(j);
      if (comp[j] == -1) lowlink[i] = min(lowlink[i], lowlink[j]);
    }
    if (lowlink[i] == index[i]) {
      do {
        j = s.top();
        s.pop();
        comp[j] = nb_cfc;
      } while (i != j);
      ++nb_cfc;
    }
  }

 public:
  void cfc() {
    id = 0;
    nb_cfc = 0;
    comp.clear();
    index.clear();
    lowlink.clear();
    comp.resize(adj.size(), -1);
    index.resize(adj.size(), -1);
    lowlink.resize(adj.size(), -1);
    for (int i = 0; i < (int)adj.size(); ++i) {
      if (index[i] == -1) tarjan(i);
    }
  }
};
void dfs(vector<vector<edge> > &graph, vector<bool> &mark, int x) {
  if (mark[x]) return;
  mark[x] = true;
  for (int i = 0; i < (graph[x].size()); ++i) {
    int y = graph[x][i].to;
    if (graph[x][i].orient == 0) {
      int j = graph[x][i].back;
      graph[x][i].orient = 1;
      graph[y][j].orient = -1;
      dfs(graph, mark, y);
    }
  }
}
int main(void) {
  int n, m;
  cin >> n >> m;
  vector<vector<edge> > graph(n);
  for (int i = 0; i < (m); ++i) {
    int x, y;
    cin >> x >> y;
    --x, --y;
    int u = graph[x].size();
    int v = graph[y].size();
    graph[x].push_back(edge(y, v));
    graph[y].push_back(edge(x, u));
  }
  vector<bool> mark(n, false);
  dfs(graph, mark, 0);
  Tarjan g;
  g.adj.assign(n, vector<int>());
  for (int x = 0; x < (n); ++x)
    for (int i = 0; i < (graph[x].size()); ++i) {
      int y = graph[x][i].to;
      if (graph[x][i].orient > 0) g.adj[x].push_back(y);
    }
  g.cfc();
  if (g.nb_cfc > 1)
    cout << 0 << endl;
  else {
    for (int i = 0; i < (n); ++i)
      for (int j = 0; j < (graph[i].size()); ++j) {
        int x = i, y = graph[i][j].to;
        if (y < x) continue;
        if (graph[i][j].orient < 0) swap(x, y);
        ++x, ++y;
        cout << x << " " << y << endl;
      }
  }
  return 0;
}
