#include <bits/stdc++.h>
using namespace std;
int t, k = 0, tot = 0;
bool f = true;
const int mxN = 1e5 + 3;
int out[mxN], in[mxN];
vector<int> adj[mxN], vis;
vector<pair<int, int>> v;
void dfs(int n, int par = -1) {
  vis[n] = 1;
  int kk = 0;
  in[n] = out[n] = ++tot;
  for (auto i : adj[n]) {
    if (i == par) continue;
    if (vis[i])
      out[n] = min(out[n], in[i]), v.push_back({n, i});
    else {
      v.push_back({n, i});
      dfs(i, n);
      kk++;
      if (out[i] > in[n]) f = false;
      out[n] = min(out[i], out[n]);
    }
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  ;
  int n, a, b, c, ans = 0, m, i, j, cn = 0, sm = 0, mx = INT_MIN, mn = INT_MAX;
  string s, ss;
  cin >> n >> m;
  set<pair<int, int>> stt;
  vis.assign(n + 1, 0);
  for (i = 1; i <= m; i++)
    cin >> a >> b, adj[a].push_back(b), adj[b].push_back(a);
  for (i = 1; i <= n; i++)
    if (!vis[i]) dfs(i);
  if (!f) return cout << 0 << "\n", 0;
  for (auto i : v) {
    if (!stt.count({i.first, i.second}))
      cout << i.first << " " << i.second << "\n";
    stt.insert({i.first, i.second});
    stt.insert({i.second, i.first});
  }
  return 0;
}
