#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
int n, m;
int head[MAXN], E;
struct Edge {
  int s, t, next, vis;
} edge[MAXN * 10];
vector<pair<int, int> > v;
int Btype, Time;
int dfn[MAXN], low[MAXN], Belong[MAXN];
int st[MAXN], Top;
inline int min(int a, int b) { return a > b ? b : a; }
void add_edge(int s, int t) {
  edge[E].s = s;
  edge[E].t = t;
  edge[E].vis = 0;
  edge[E].next = head[s];
  head[s] = E++;
}
void dfs(int s) {
  int i, t;
  st[++Top] = s;
  dfn[s] = low[s] = ++Time;
  for (i = head[s]; i != -1; i = edge[i].next) {
    if (edge[i].vis) continue;
    v.push_back(make_pair(edge[i].s, edge[i].t));
    edge[i].vis = edge[i ^ 1].vis = 1;
    t = edge[i].t;
    if (!dfn[t]) {
      dfs(t);
      low[s] = min(low[s], low[t]);
    } else
      low[s] = min(low[s], dfn[t]);
  }
  if (dfn[s] == low[s]) {
    Btype++;
    do {
      t = st[Top--];
      Belong[t] = Btype;
    } while (t != s);
  }
}
int main() {
  int i, j;
  scanf("%d%d", &n, &m);
  memset(head, -1, sizeof(head));
  E = 0;
  int x, y;
  for (i = 0; i < m; i++) {
    scanf("%d%d", &x, &y);
    add_edge(x, y);
    add_edge(y, x);
  }
  dfs(1);
  if (Btype == 1) {
    for (i = 0; i < v.size(); i++) printf("%d %d\n", v[i].first, v[i].second);
  } else
    printf("0\n");
  return 0;
}
