#include using namespace std; typedef long long int uli; struct edge{int v,i;}; const int mxv=66; const int mxe=mxv*mxv; int n,m; vectorg[mxv]; int us[mxe],vs[mxe],col[mxe]; bool vis[mxv],vise[mxe]; vectortree[2][mxv]; int par[2][mxv],ear[2][mxv]; int ti[2][mxv],to[2][mxv],T=0; bool connector[mxe]; vectorbip[mxe]; vectorlyr[mxv]; vectoreul[mxv]; listlst; //find eulerian path void epath(int u,list::iterator it){ while(!eul[u].empty()){ edge to=eul[u].back(); eul[u].pop_back(); if(vise[to.i])continue; it=lst.insert(it,to); auto nit=it; nit++; vise[to.i]=true; epath(to.v,nit); } } void dfs(int u,int c){ vis[u]=true; for(auto e:g[u])if(!vis[e.v] && col[e.i]==-1){ col[e.i]=c; dfs(e.v,c); } } void root(int u,int pu,int c,int l=0){ lyr[l].push_back(u); ti[c][u]=T++; par[c][u]=pu; for(auto e:tree[c][u])if(e.v!=pu){ ear[c][e.v]=e.i; root(e.v,u,c,l+1); } to[c][u]=T++; } bool child(int v,int u,int c){ return ti[c][u]<=ti[c][v] && ti[c][v]<=to[c][u]; } int lca(int u,int v,int c){ while(!child(v,u,c) && u!=par[c][u]){ u=par[c][u]; } if(!child(v,u,c))return -1; return u; } void trees(){ for(int it=0;it<2;it++)for(int i=0;iq; q.push(u); pbfs[u]=u; int idx=-1; while(!q.empty()){ u=q.front(); q.pop(); if(connector[u]) if(idx==-1 || d[u]0;l--){ for(int u:lyr[l]){ if(eul[u].size()%2==1){ int pu=par[0][u]; int eu=ear[0][u]; eul[u].push_back({pu,eu}); eul[pu].push_back({u,eu}); } } } memset(vise,false,sizeof vise); lst.clear(); epath(0,lst.begin()); assert((int)lst.size()<=m); printf("%d",(int)lst.size()); for(auto e:lst)printf(" %d",e.i+1); puts(""); } return 0; }