package main
import (
"bufio"
"fmt"
"os"
)
func readInt(reader *bufio.Reader) int {
var n int
var c byte
var err error
for {
c, err = reader.ReadByte()
if err != nil {
return 0
}
if c >= '0' && c <= '9' {
break
}
}
n = int(c - '0')
for {
c, err = reader.ReadByte()
if err != nil || c < '0' || c > '9' {
break
}
n = n*10 + int(c-'0')
}
return n
}
func main() {
reader := bufio.NewReaderSize(os.Stdin, 65536)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
n := readInt(reader)
if n == 0 {
return
}
stacks := make([][]int, n+1)
for i := 1; i <= n; i++ {
k := readInt(reader)
stacks[i] = make([]int, k)
for j := 0; j < k; j++ {
stacks[i][j] = readInt(reader)
}
}
state := make([]int, n+1)
P := make([]int, 0, n+1)
for i := 1; i <= n; i++ {
for state[i] == 0 {
P = P[:0]
P = append(P, i)
state[i] = 1
for len(P) > 0 {
u := P[len(P)-1]
if len(stacks[u]) == 0 {
state[u] = 2
P = P[:len(P)-1]
continue
}
v := stacks[u][len(stacks[u])-1]
if state[v] == 0 {
state[v] = 1
P = append(P, v)
} else if state[v] == 1 {
idx := len(P) - 1
for P[idx] != v {
idx--
}
for j := idx; j < len(P); j++ {
x := P[j]
state[x] = 0
stacks[x] = stacks[x][:len(stacks[x])-1]
}
P = P[:idx]
} else if state[v] == 2 {
state[u] = 2
P = P[:len(P)-1]
}
}
}
}
ans := make([]int, n+1)
path := make([]int, 0, n+1)
for i := 1; i <= n; i++ {
if ans[i] != 0 {
continue
}
path = path[:0]
curr := i
for ans[curr] == 0 {
if len(stacks[curr]) == 0 {
ans[curr] = curr
break
}
path = append(path, curr)
curr = stacks[curr][len(stacks[curr])-1]
}
res := ans[curr]
for _, u := range path {
ans[u] = res
}
}
for i := 1; i <= n; i++ {
fmt.Fprint(writer, ans[i])
if i < n {
fmt.Fprint(writer, " ")
}
}
fmt.Fprintln(writer)
}