#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
vector<int> v[N], vt[N], vn[N], vnt[N];
bool viz[N];
set<pair<int, int> > ans;
void dfs(int x, int u) {
  viz[x] = 1;
  for (auto it : v[x])
    if (it != u) {
      if (ans.find({it, x}) == ans.end()) ans.insert({x, it});
      if (!viz[it]) dfs(it, x);
    }
  for (auto it : vt[x])
    if (it != u) {
      if (!viz[it]) {
        ans.insert({x, it});
        dfs(it, x);
      } else if (ans.find({it, x}) == ans.end()) {
        ans.insert({x, it});
      }
    }
}
void dfs2(int x) {
  viz[x] = 1;
  for (auto it : vn[x])
    if (!viz[it]) dfs2(it);
}
void dfs3(int x) {
  viz[x] = 1;
  for (auto it : vnt[x])
    if (!viz[it]) dfs3(it);
}
int main() {
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int x, y;
    cin >> x >> y;
    v[x].push_back(y);
    vt[y].push_back(x);
  }
  dfs(1, 0);
  for (auto it : ans) {
    vn[it.first].push_back(it.second);
    vnt[it.second].push_back(it.first);
  }
  memset(viz, 0, sizeof(viz));
  dfs2(1);
  for (int i = 1; i <= n; i++)
    if (!viz[i]) {
      cout << 0;
      return 0;
    }
  memset(viz, 0, sizeof(viz));
  dfs3(1);
  for (int i = 1; i <= n; i++)
    if (!viz[i]) {
      cout << 0;
      return 0;
    }
  for (auto it : ans) cout << it.first << " " << it.second << "\n";
}
