from collections import deque

# データの入力
N = int(input())
DG = {}
for i in range(N):
    tmp = input().split()
    if int(tmp[1]) != 0:
        DG[i] = [int(x)-1 for x in tmp[2:]]
    else:
        DG[i] = []


result = {}
is_visited = {key: False for key in range(N)}
# bfs
# 初期queue
que = deque([(0, 0)])  # 必要なものはnodeidと原点からの距離
while que:
    nodeid, cost = que.popleft()  # 先入れ先出し
    result[nodeid] = cost
    is_visited[nodeid] = True  # この文は最初の1for目しか意味ないんだけどなんかうまい方法ないのか
    for nextnode in DG[nodeid]:
        if is_visited[nextnode]:
            pass
        else:  # 未訪問のものについては探索候補に入れる
            que.append((nextnode, cost + 1))
            is_visited[nextnode] = True  # 探索候補に入れた瞬間に訪問管理しないと重複を生じる場合がある

for i in range(N):
    if is_visited[i]:
        print(i + 1, result[i])
    else:
        print(i+1, -1) from collections import deque N = int(input()) N int(input()) int input() input DG = {} DG {} for i in range(N):
    tmp = input().split()
    if int(tmp[1]) != 0:
        DG[i] = [int(x)-1 for x in tmp[2:]]
    else:
        DG[i] = [] i range(N) range N tmp = input().split() tmp input().split() ().split () input split if int(tmp[1]) != 0:
        DG[i] = [int(x)-1 for x in tmp[2:]]
    else:
        DG[i] = [] int(tmp[1]) != 0 int(tmp[1]) int tmp[1] tmp 1 0 int(x)-1 for x in tmp[2:] for x in tmp[2:] x tmp[2:] tmp 2: 2 for x in tmp[2:] int(x)-1 int(x) int x 1 DG[i] = [int(x)-1 for x in tmp[2:]] DG[i] DG i [int(x)-1 for x in tmp[2:]] DG[i] = [] DG[i] DG i [] result = {} result {} key: False for key in range(N) for key in range(N) key range(N) range N for key in range(N) key False is_visited = {key: False for key in range(N)} is_visited {key: False for key in range(N)} que = deque([(0, 0)]) que deque([(0, 0)]) deque [(0, 0)] (0, 0) 0 0 while que:
    nodeid, cost = que.popleft()  # 先入れ先出し
    result[nodeid] = cost
    is_visited[nodeid] = True  # この文は最初の1for目しか意味ないんだけどなんかうまい方法ないのか
    for nextnode in DG[nodeid]:
        if is_visited[nextnode]:
            pass
        else:  # 未訪問のものについては探索候補に入れる
            que.append((nextnode, cost + 1))
            is_visited[nextnode] = True  # 探索候補に入れた瞬間に訪問管理しないと重複を生じる場合がある que nodeid, cost = que.popleft() nodeid que.popleft() que.popleft que popleft cost result[nodeid] = cost result[nodeid] result nodeid cost is_visited[nodeid] = True is_visited[nodeid] is_visited nodeid True for nextnode in DG[nodeid]:
        if is_visited[nextnode]:
            pass
        else:  # 未訪問のものについては探索候補に入れる
            que.append((nextnode, cost + 1))
            is_visited[nextnode] = True  # 探索候補に入れた瞬間に訪問管理しないと重複を生じる場合がある nextnode DG[nodeid] DG nodeid if is_visited[nextnode]:
            pass
        else:  # 未訪問のものについては探索候補に入れる
            que.append((nextnode, cost + 1))
            is_visited[nextnode] = True  # 探索候補に入れた瞬間に訪問管理しないと重複を生じる場合がある is_visited[nextnode] is_visited nextnode que.append((nextnode, cost + 1)) que.append que append (nextnode, cost + 1) nextnode cost + 1 cost 1 is_visited[nextnode] = True is_visited[nextnode] is_visited nextnode True for i in range(N):
    if is_visited[i]:
        print(i + 1, result[i])
    else:
        print(i+1, -1) i range(N) range N if is_visited[i]:
        print(i + 1, result[i])
    else:
        print(i+1, -1) is_visited[i] is_visited i print(i + 1, result[i]) print i + 1 i 1 result[i] result i print(i+1, -1) print i+1 i 1 -1 cost = que.popleft() que.popleft() cost result = {} {} result que = deque([(0, 0)]) deque([(0, 0)]) que N = int(input()) int(input()) N is_visited = {key: False for key in range(N)} {key: False for key in range(N)} is_visited nodeid, cost = que.popleft() que.popleft() nodeid DG = {} {} DG tmp = input().split() input().split() tmp
from collections import deque

# データの入力
N = int(input())
DG = {}
for i in range(N):
    tmp = input().split()
    if int(tmp[1]) != 0:
        DG[i] = [int(x)-1 for x in tmp[2:]]
    else:
        DG[i] = []


result = {}
is_visited = {key: False for key in range(N)}
# bfs
# 初期queue
que = deque([(0, 0)])  # 必要なものはnodeidと原点からの距離
while que:
    nodeid, cost = que.popleft()  # 先入れ先出し
    result[nodeid] = cost
    is_visited[nodeid] = True  # この文は最初の1for目しか意味ないんだけどなんかうまい方法ないのか
    for nextnode in DG[nodeid]:
        if is_visited[nextnode]:
            pass
        else:  # 未訪問のものについては探索候補に入れる
            que.append((nextnode, cost + 1))
            is_visited[nextnode] = True  # 探索候補に入れた瞬間に訪問管理しないと重複を生じる場合がある

for i in range(N):
    if is_visited[i]:
        print(i + 1, result[i])
    else:
        print(i+1, -1)
