#include<bits/stdc++.h>
using namespace std;
int n,m,a,b,k,l,t,num,head[200000],low[200000],dfn[200000],f[200000];
struct edge{int next,to;}g[300000];
pair<int,int>ans[200000];
void add(int u,int v){g[++num]=(edge){head[u],v};head[u]=num;}
void dfs(int u,int x){
low[u]=dfn[u]=++k;
for(int i=head[u];i;i=g[i].next){
if(i!=(x^1)){
int v=g[i].to;
if(!dfn[v]){
dfs(v,i);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u]) ans[++t]=make_pair(min(u,v),max(u,v));
}
else low[u]=min(low[u],dfn[v]);
}
}
}
int main(){
cin>>n>>m;
while(m--) scanf("%d%d",&a,&b),add(a,b),add(b,a);
for(int i=1;i<=n;++i) if(!dfn[i]) dfs(i,-1);
sort(ans+1,ans+1+t);
for(int i=1;i<=t;++i) printf("%d %d\n",ans[i].first,ans[i].second);
return 0;
}