#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<vector>
#include<cmath>
#include<stack>
#include<queue>
#include<map>
#include<set>
using namespace std;
struct edge {
int next,to,w;
} edges[5005];
struct baga {
int a1,a2;
} baga_[5005];
int n,m,cnt,endd;
int x[5005],y[5005];
int head[155],vis[5005],ans[5005];
void addEdge(int u,int v,int w) {
edges[++cnt].w=w;
edges[cnt].to=v;
edges[cnt].next=head[u];
head[u]=cnt;
}
bool cmp(baga l,baga k) {
if(l.a1>k.a1) {
return 0;
} else if(l.a1==k.a1) {
if(l.a2>k.a2) {
return 0;
}
} else {
return 1;
}
}
void dij(int x,int y) {
memset(ans,0x3f3f3f3f,sizeof(ans));
priority_queue<pair<int,int>,vector<pair<int,int> > ,greater<pair<int,int> > >que;
ans[x]=0;
vis[x]=1;
que.push(make_pair(0,x));
while(!que.empty()) {
int now=que.top().second,diss=que.top().first;
que.pop();
vis[now]=0;
for(int i=head[now]; i!=0; i=edges[i].next) {
int to=edges[i].to;
if(now==x&to==y)continue;
if(ans[to]>diss+edges[i].w) {
ans[to]=diss+edges[i].w;
que.push(make_pair(ans[to],to));
}
}
}
}
int main() {
cin>>n>>m;
for(int i=1; i<=m; i++) {
cin>>x[i]>>y[i];
addEdge(x[i],y[i],1);
addEdge(y[i],x[i],1);
}
for(int i=1; i<=m; i++) {
dij(x[i],y[i]);
if(ans[y[i]]==0x3f3f3f3f) {
endd++;
baga_[endd].a1=min(x[i],y[i]);
baga_[endd].a2=max(x[i],y[i]);
}
}
sort(baga_+1,baga_+1+endd,cmp);
for(int i=1; i<=endd; i++) {
cout<<baga_[i].a1<<" "<<baga_[i].a2<<endl;
}
return 0;
}
有没有大佬可以解释一下dij里面的vis[now]=0(雾