#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 20;
int N, M, der[maxn], low[maxn];
map<pair<int, int>, bool> yol;
int used[maxn];
vector<int> komsu[maxn];
int dfs(int node, int dad, int dr) {
  used[node] = 1;
  der[node] = dr;
  low[node] = 1e9;
  for (int i = 0; i < komsu[node].size(); i++)
    if (komsu[node][i] != dad) {
      int x = komsu[node][i];
      if (!used[x]) {
        yol[pair<int, int>(node, x)] = 1;
        dfs(x, node, dr + 1);
        if (low[x] > der[node]) {
          printf("0\n");
          exit(0);
        }
        low[node] = min(low[node], low[x]);
        continue;
      } else if (used[x] == 1) {
        low[node] = min(low[node], der[x]);
        yol[pair<int, int>(node, x)] = 1;
      } else if (used[x] == 2)
        low[node] = min(low[node], low[x]);
    }
  used[node] = 2;
  return low[node];
}
int main() {
  scanf("%d %d", &N, &M);
  for (int i = 1; i <= M; i++) {
    int a, b;
    scanf("%d %d", &a, &b);
    komsu[a].push_back(b);
    komsu[b].push_back(a);
  }
  dfs(1, 0, 1);
  for (int i = 1; i <= N; i++)
    for (int j = 0; j < komsu[i].size(); j++) {
      int x = komsu[i][j];
      if (yol[pair<int, int>(i, x)]) printf("%d %d\n", i, x);
    }
  return 0;
}
