#include <bits/stdc++.h> using namespace std; const int maxn=10010; vectorG[maxn]; int n,m,x,y,index_,dfn[maxn],low[maxn],ans,a; struct Edge{int from,to;}edge[maxn]; void add_edge(int x,int y) { edge[ans].from=min(x,y); edge[ans].to=max(x,y); ans++; } void dfs(int now,int f) { int c; index_++; dfn[now]=index_; low[now]=dfn[now]; for(int i=0;i<G[now].size();i++) { c=G[now][i]; if (dfn[c]&&dfn[c]!=f) { low[now]=min(low[now],dfn[c]); } if (dfn[c]==0) { dfs(c,now); if(dfn[now]<low[c])add_edge(now,G[now][i]); low[now]=min(low[now],dfn[c]); } } } bool cmp(Edge x,Edge y) { if (x.from>y.from) { return false; } else if (x.from==y.from) { return (x.to<y.to); } return true; } int main() { int n,m; cin>>n>>m; for (int i = 1; i <= m; i++) { int a,b; cin>>a>>b; G[a].push_back(b); G[b].push_back(a); } dfs(1,1); sort(edge,edge+ans,cmp); for (int i=0;i<ans;i++) { cout<<edge[i].from<<" "<<edge[i].to<<endl; } return 0; }