#include<bits/stdc++.h>
#define akioi register
#define ENDL putchar('\n');
#define SPACE putchar(' ');
using namespace std;
inline int read() {
register int r=0;
register char c=getchar();
while(c>'9'||c<'0')c=getchar();
while(c>='0'&&c<='9')r=(r<<1)+(r<<3)+c-'0',c=getchar();
return r;
}
inline void put(int x) {
if(x<0) {
putchar('-');
x=-x;
}
if(x>9)put(x/10);
putchar(x%10+'0');
return;
}
int f[10010];
inline int find(int x) {
while(f[x]!=x)x=f[x]=f[f[x]];
return x;
}
inline void enery(int a,int b) {
f[find(a)]=find(b);
return;
}
int m,d[10010];
struct b {
int to,next,i;
} v[20010];
int first[10010],len;
void add(int x,int y,int i) {
++len;
v[len].next=first[x];
v[len].i=i;
first[x]=len;
v[len].to=y;
return;
}
int l1,l2;
int p[10010],n,book[10010];
int k;//连通块个数
int kp[3];//连通块中的父亲节点
//k==1:
int jd,s,js[5];
//k==2:
int jd1,jd2,s1,s2;
stack<int> st;
int vis[20010];
void eular(int u) {
for(int i=first[u]; i; i=v[i].next) {
if(vis[v[i].i])continue;
vis[v[i].i]=1;
eular(v[i].to);
st.push(v[i].i);
}
return;
}
void putst() {
while(!st.empty()) {
put(st.top());
SPACE
st.pop();
}
return;
}
queue<int> c1,c2;
bool is1o2=1;
void getans() {
while(!st.empty()) {
if(st.top()==0)l2=st.size()-1,l1=m-l2,is1o2=0;
else if(is1o2)c1.push(st.top());
else c2.push(st.top());
st.pop();
}
return;
}
signed main() {
// freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
for(int i=1; i<=10010; i++)f[i]=i;
m=read();
for(int i=1; i<=m; i++) {
akioi int u,v;
u=read();
v=read();
add(u,v,i);
add(v,u,i);
enery(u,v);
if(!book[u])p[++n]=u,book[u]=1;
if(!book[v])p[++n]=v,book[v]=1;
d[u]++;
d[v]++;
}
// cout << n << " ";
for(int i=1; i<=n; i++) {
// cout << find(p[i]) << " ";
if(find(p[i])==p[i]) {
k++;
if(k==1)kp[1]=p[i];
else kp[2]=p[i];
}
}
if(k>2||(k==1&&m==1)) {
put(-1);
return 0;
}
s=p[1];
s1=kp[1];
s2=kp[2];
for(int i=1; i<=n; i++) {
if(kp[1]==find(p[i]))l1++;
if(d[p[i]]&1) {
if(k==1) {
s=p[i];
if(jd<=4)js[++jd]=p[i];
else ++jd;
} else {
if(find(p[i])==kp[1])jd1++,s1=p[i];
else jd2++,s2=p[i];
}
}
}
// cout << k << " " << jd1 << " " << jd2 << "\n";
if((jd>4&&k==1)||((jd1>2||jd2>2)&&k==2)) {
put(-1);
return 0;
}
if(k==2) {
put(l1);
ENDL
eular(s1);
putst();
ENDL
put(m-l1);
ENDL
eular(s2);
putst();
ENDL
} else if(k==1) {
if(jd==4) {
add(js[2],js[3],0);
add(js[3],js[2],0);
eular(js[4]);
getans();
put(l1);
ENDL
while(!c1.empty()) {
put(c1.front());
SPACE
c1.pop();
}
ENDL
put(l2);
ENDL
while(!c2.empty()) {
put(c2.front());
SPACE
c2.pop();
}
// putst();
} else {
eular(s);
put(m-1);
ENDL
while(st.size()>1) {
put(st.top());
SPACE
st.pop();
}
ENDL
put(1);
ENDL
put(st.top());
}
}
return 0;
}
/*
8
1 2
1 3
1 6
2 4
2 6
4 6
3 6
7 7
*/
/*
4
1 2
2 4
2 3
2 5
*/
交上去只过了前三个点