/*
ID: niepeng1
PROG: race3
LANG: C++
*/
/*
基本上就是模拟。
如果是不可绕过的节点,则通过去除该节点后,不会有路径通到最后一个节点(深搜)。
如果是可分割节点,则去除该节点后从开始节点遍历 和 从该节点直接开始遍历应该没有可以重复到达的节点(深搜)。
*/
#include<iostream>
#include<algorithm>
#include<memory.h>
#include<math.h>
int a[51][100];
int unav[51],split[51];
bool get[51],ttem[51];
void Dfs(int s)
{
int i;
if(get[s]) return;
get[s]=true;
for(i=1;i<=a[s][0];i++)
Dfs(a[s][i]);
}
int main()
{
freopen("race3.in","r",stdin);
freopen("race3.out","w",stdout);
bool cond=false;
int n,tem,i,j;
for(n=0;;n++){
a[n][0]=0;
while(scanf("%d",&tem) && tem>=0){
a[n][++a[n][0]]=tem;
}
if( tem == -1)
break;
}
while(!a[n-1][0]) n--;
unav[0]=0;split[0]=0;
for(i=1;i<n;i++){
memset(get,false,sizeof(get));
get[i]=true;
Dfs(0);
if(!get[n]) unav[++unav[0]]=i;
memcpy(ttem,get,sizeof(get));
memset(get,false,sizeof(get));
//get[i]=true;
Dfs(i);
cond=false;
for(j=0;j<=n;j++){
if(j!=i&&get[j] && ttem[j]){
cond=true;
break;
}
}
if( !cond) split[++split[0]]=i;
}
for(i=0;i<=unav[0];i++)
{
if(i) printf(" ");
printf("%d",unav[i]);
}
printf("/n");
for(i=0;i<=split[0];i++)
{
if(i) printf(" ");
printf("%d",split[i]);
}
printf("/n");
return 0;
}