
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,n) for(long long i=0; i<(n); i++)
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; }
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; }

ll cnt = 0;
vector<pair<ll,ll>> res;
vector<ll> ord(100005, -1), pre(100005, -1);
vector<vector<ll>> edge(100005);

void dfs(ll i, ll j){
    ord[i] = cnt;
    pre[i] = cnt;
    cnt++;
    for(ll x : edge[i]){
        if(x == j) continue;
        if(ord[x] > -1) chmin(pre[i], pre[x]);
        else dfs(x, i);
    }
    if(j > -1) chmin(pre[j], pre[i]);
    if(j > -1 && pre[i] > ord[j]) res.push_back({min(i, j), max(i, j)});
    return;
}

int main(){
    ll v,e; cin>>v>>e;
    rep(i, e){
        ll s,t; 
        cin>>s>>t;
        edge[s].push_back(t);
        edge[t].push_back(s);
    }
    vector<ll> ord(v, -1), pre(v, -1);
    dfs(0, -1);
    sort(res.begin(), res.end());
    for(pair<ll,ll> p : res){
        cout<<p.first<<' '<<p.second<<endl;
    }

    return 0;
}

### Prompt

Your challenge is to write a CPP solution to the following problem:

Find bridges of an undirected graph G(V, E).

A bridge (also known as a cut-edge) is an edge whose deletion increase the number of connected components.

Constraints

* 1 ≤ |V| ≤ 100,000
* 0 ≤ |E| ≤ 100,000
* The graph is connected
* There are no parallel edges
* There are no self-loops

Input


|V| |E|
s0 t0
s1 t1
:
s|E|-1 t|E|-1


, where |V| is the number of nodes and |E| is the number of edges in the graph. The graph nodes are named with the numbers 0, 1,..., |V|-1 respectively.

si and ti represent source and target nodes of i-th edge (undirected).

Output

A list of bridges of the graph ordered by name. For each bridge, names of its end-ponints, source and target (source < target), should be printed separated by a space. The sources should be printed ascending order, then the target should also be printed ascending order for the same source.

Examples

Input

4 4
0 1
0 2
1 2
2 3


Output

2 3


Input

5 4
0 1
1 2
2 3
3 4


Output

0 1
1 2
2 3
3 4

### Response

```cpp

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,n) for(long long i=0; i<(n); i++)
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; }
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; }

ll cnt = 0;
vector<pair<ll,ll>> res;
vector<ll> ord(100005, -1), pre(100005, -1);
vector<vector<ll>> edge(100005);

void dfs(ll i, ll j){
    ord[i] = cnt;
    pre[i] = cnt;
    cnt++;
    for(ll x : edge[i]){
        if(x == j) continue;
        if(ord[x] > -1) chmin(pre[i], pre[x]);
        else dfs(x, i);
    }
    if(j > -1) chmin(pre[j], pre[i]);
    if(j > -1 && pre[i] > ord[j]) res.push_back({min(i, j), max(i, j)});
    return;
}

int main(){
    ll v,e; cin>>v>>e;
    rep(i, e){
        ll s,t; 
        cin>>s>>t;
        edge[s].push_back(t);
        edge[t].push_back(s);
    }
    vector<ll> ord(v, -1), pre(v, -1);
    dfs(0, -1);
    sort(res.begin(), res.end());
    for(pair<ll,ll> p : res){
        cout<<p.first<<' '<<p.second<<endl;
    }

    return 0;
}

```