#include <bits/stdc++.h>
using namespace std;
const int N = 1e5;
int n, m, sec, cnt;
int low[N + 2], disc[N + 2];
bool vis[N + 2];
vector<int> adj[N + 2];
vector<pair<int, int> > res;
set<pair<int, int> > st;
void dfs(int cur, int par) {
  low[cur] = disc[cur] = sec++;
  for (int nx : adj[cur]) {
    if (nx == par) continue;
    if (disc[nx] == -1) {
      dfs(nx, cur);
      low[cur] = min(low[cur], low[nx]);
      if (low[nx] > disc[cur]) cnt++;
    } else
      low[cur] = min(low[cur], disc[nx]);
  }
}
void solve(int cur) {
  if (vis[cur]) return;
  vis[cur] = 1;
  for (int nx : adj[cur]) {
    if (!st.count({nx, cur})) {
      st.insert({cur, nx});
      res.push_back({cur, nx});
      solve(nx);
    }
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int u, v;
    cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  memset(disc, -1, sizeof(disc));
  dfs(1, 0);
  if (cnt > 0) {
    cout << "0\n";
    return 0;
  }
  solve(1);
  for (auto i : res) {
    cout << i.first << ' ' << i.second << '\n';
  }
  return 0;
}
