#include<bits/stdc++.h> using namespace std; const int N=200; const int M=1e4+10; struct node{ int x,y; }e[M]; int n,m,tot,num,lin[N],dfn[N],low[N],Next[M],ver[M],lef[M],cut[M]; void add(int x,int y){ lef[++tot]=x;ver[tot]=y;Next[tot]=lin[x];lin[x]=tot; } void tarjan(int x,int in_edge){ dfn[x]=low[x]=++num; for(int i=lin[x];i;i=Next[i]){ int y=ver[i]; if(!dfn[y]){ tarjan(y,i); low[x]=min(low[x],low[y]); if(dfn[x]<low[y]) cut[i]=cut[i^1]=1; }else if(i!=(in_edge^1)) low[x]=min(low[x],dfn[y]); } } bool cmp(node a,node b){ return (a.x<b.x||a.x==b.x&&a.y<b.y); } int main(){ tot=1; scanf("%d%d",&n,&m); for(int i=1;i<=m;++i){ int x,y;scanf("%d%d",&x,&y); add(x,y);add(y,x); } for(int i=1;i<=n;++i) if(!dfn[i]) tarjan(i,0); num=0; for(int i=2;i<tot;i+=2) if(cut[i]) e[++num].x=min(lef[i],ver[i]),e[num].y=max(ver[i],lef[i]); sort(e+1,e+num+1,cmp); for(int i=1;i<=num;++i) printf("%d %d\n",e[i].x,e[i].y); return 0; }