//just 模板题。
////toposort
//给出大于和小于关系,实际上是要找一条边连接这些点。
//如果图中存在有向环,则不存在拓扑排序,反之则存在
//
//有向无环图
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#define MAXN 500
using namespace std;
int G[MAXN][MAXN];
int c[MAXN];
int topo[MAXN],t;///用于存排序后的点
int n;
//本题属于最基础的拓扑排序。大意就是,给出一个数n,
//然后底下n行,编号1到n, 每行输入几个数,保证结果中该行的编号要在这几个数前面。
bool dfs(int u) ///0-n-1个点
{
c[u]=-1;
for(int v=1;v<=n;v++)
if(G[u][v])///在访问这个点时,c[i]=-1,如果找到-1,即回到了这个点,即有环
{
if(c[v]<0) return false;///存在有向环,失败退出。
else if(!c[v]&&!dfs(v)) return false;///未访问过而且找不到下一个连接的点,则返回false
}
//cout<<"miao"<<endl;
c[u]=1;topo[t--]=u;///成功找到,进栈,先遍历到的是根节点,所以倒序入栈
return true;
}
bool toposort()
{
t=n;
memset(c,0,sizeof(c));///初始设定都为未访问
for(int u=1;u<=n;u++)
if(!c[u])///未访问过才去访问他
{
if(!dfs(u)) return false;///这个点找不到连接,returned false;
}
return true;
}
int main()
{
int a;
//freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
{
while(1)
{
scanf("%d",&a);
if(a==0) break;
G[i][a]=1;
// cout<<i<<" "<<a<<endl;
}
}
toposort();
for(int i=1;i<=n-1;i++)
cout<<topo[i]<<" ";
cout<<topo[n]<<endl;
}
}