package main
import (
"io"
"os"
)
func main() {
input, _ := io.ReadAll(os.Stdin)
var pos int
nextInt := func() int {
for pos < len(input) && (input[pos] < '0' || input[pos] > '9') {
pos++
}
if pos >= len(input) {
return 0
}
res := 0
for pos < len(input) && input[pos] >= '0' && input[pos] <= '9' {
res = res*10 + int(input[pos]-'0')
pos++
}
return res
}
n := nextInt()
if n == 0 {
return
}
stacks := make([][]int, n+1)
for i := 1; i <= n; i++ {
k := nextInt()
if k > 0 {
stacks[i] = make([]int, k)
for j := 0; j < k; j++ {
stacks[i][j] = nextInt()
}
}
}
ans := make([]int, n+1)
done := make([]bool, n+1)
inPath := make([]bool, n+1)
path := make([]int, 0, n+1)
for i := 1; i <= n; i++ {
if done[i] {
continue
}
path = append(path, i)
inPath[i] = true
for len(path) > 0 {
u := path[len(path)-1]
if len(stacks[u]) == 0 {
for _, x := range path {
ans[x] = u
done[x] = true
inPath[x] = false
}
path = path[:0]
break
}
nxt := stacks[u][len(stacks[u])-1]
if done[nxt] {
for _, x := range path {
ans[x] = ans[nxt]
done[x] = true
inPath[x] = false
}
path = path[:0]
break
} else if inPath[nxt] {
var idx int
for j := len(path) - 1; j >= 0; j-- {
if path[j] == nxt {
idx = j
break
}
}
stacks[nxt] = stacks[nxt][:len(stacks[nxt])-1]
for j := idx + 1; j < len(path); j++ {
node := path[j]
stacks[node] = stacks[node][:len(stacks[node])-1]
inPath[node] = false
}
path = path[:idx+1]
} else {
path = append(path, nxt)
inPath[nxt] = true
}
}
}
out := make([]byte, 0, n*8)
for i := 1; i <= n; i++ {
if i > 1 {
out = append(out, ' ')
}
out = appendInt(out, ans[i])
}
out = append(out, '\n')
os.Stdout.Write(out)
}
func appendInt(b []byte, v int) []byte {
if v == 0 {
return append(b, '0')
}
var buf [20]byte
i := 19
for v > 0 {
buf[i] = byte('0' + v%10)
v /= 10
i--
}
return append(b, buf[i+1:]...)
}