#include #define rep(i,n) for(int i=0;i<(n);i++) using namespace std; using graph=vector>; void add_undirected_edge(graph& G,int u,int v){ G[u].emplace_back(v); G[v].emplace_back(u); } class two_edge_connected_components{ int idx; vector ord,low,id; const graph& G; vector> Comp; vector> B; graph Tr; void dfs1(int u,int p){ ord[u]=low[u]=idx++; bool f=true; for(int v:G[u]){ if(v==p && f){ f=false; continue; } if(ord[v]==-1){ dfs1(v,u); low[u]=min(low[u],low[v]); } else{ low[u]=min(low[u],ord[v]); } } } void dfs2(int u,int p){ if(p==-1 || ord[p]& component(int i)const{ return Comp[i]; } const vector>& bridges()const{ return B; } const graph& bridge_block_tree()const{ return Tr; } }; int main(){ int n; scanf("%d",&n); graph G(n); vector> E(n); rep(i,n){ int u,v; scanf("%d%d",&u,&v); u--; v--; add_undirected_edge(G,u,v); E[i]={u,v}; } two_edge_connected_components TECC(G); vector id(n); rep(i,TECC.bridge_block_tree().size()) for(int u:TECC.component(i)) id[u]=i; vector ans; rep(i,n) if(id[E[i].first]==id[E[i].second]) ans.emplace_back(i); printf("%ld\n",ans.size()); rep(i,ans.size()) printf("%d%c",ans[i]+1,i+1