"""
(실전 문제) 커리큘럼 p, 303

- 온라인 강의는 '선수(먼저)' 강의가 있을 수 있는데,
  선수 강의가 있는 강의는 [ 선수 강의를 먼저 들어야만 ] '해당 강의를' 들을 수 있다.

- 예를 들어 ‘알고리즘’ 강의의 [ 선수 강의 ]로 ‘자료구조’가 존재한다면, 
  < ‘자료구조’를 들은 이후 >에 ‘알고리즘’ 강의를 들을 수 있다.
  
- N개의 강의를 듣고자 한다. 모든 강의는 ' 1번부터 N번까지의 번호 '를 가지며 
 또한, [ 동시에 여러 개의 강의 ]를 들을 수 있다.

- 예를 들어 N=3일 때, 3번 강의의 '선수 강의'로 [ 1번과 2번 강의 ]가 있고,
  1번과 2번 강의는 [ 선수 강의가 '없다고' 가정 ]하자. 각 강의에 대하여 강의 시간은 다음과 같다.

1번 강의 : 30시간
2번 강의 : 20시간
3번 강의 : 40시간

- 이 경우 '1번 강의를' 수강하기까지의 최소 시간은 30시간, 
  '2번 강의를' 수강하기까지의 최소 시간은 20시간, 
  '3번 강의를' 수강하기까지의 최소 시간은 [ 70시간 ]이다.

- [ N개의 강의 정보 ]가 주어졌을 때, 'N개의 강의'에 대하여 [ 수강하기까지 걸리는 최소 시간을 ]
  각각 출력하는 프로그램을 작성하시오.
  ------------------------------------------------------------------------------
[ 입력 조건 ]

- 첫째 줄에 듣고자 하는 강의의 수 N (1 ≤ N ≤ 500)이 주어진다.

- 다음 N개의 줄에는 [ 각 강의의 강의 시간 ]과 그 강의를 듣기 위해 [ 먼저 들어야하는 강의들의 번호 ]가
  자연수로 주어지며, 각 자연수는 공백으로 구분한다. 이때 강의 시간은 100,000 이하의 자연수이다.

- 각 [ 강의 번호 ]는 1부터 N까지로 구성되며, 각 줄은 -1로 끝난다.
  

[ 출력 조건 ]

- [ N개의 강의 ]에 대하여 수강하기까지 걸리는 [ 최소 시간 ]을 '한 줄에 하나씩 출력'한다.

( 핵심 아이디어 )
- [ 첫번째는 ] 강의시간, [ 두번째는 ] 선수과목 인덱스, -1은 종료
  해당 과목을 수강하기 까지 최소시간 구하기.
  
- 리스트의 경우, 단순히 대입 연산을 하면 값이 변경될 때 문제가 발생할 수 있기 때문에
  리스트의 값을 복제해야 할 때는 deepcopy() 함수를 사용한다.
"""

# 책 정답 10-9.py (p, 304 ~ 305)
from collections import deque
import copy # 리스트 복사 

# [ 노드의 개수(강의 수) ] 입력받기
v = int(input())

# 모든 노드에 대한 [ 진입차수는 0으로 초기화 ]
indegree = [0] * (v + 1)

# 각 노드에 연결된 '간선 정보를 담기 위한' 연결 리스트(그래프) 초기화
graph = [[] for i in range(v + 1)]

# 각 [ 강의 시간을 ] '0'으로 초기화
time = [0] * (v + 1)

# 방향 그래프의 [ 모든 간선 정보 ]를 입력받기
for i in range(1, v + 1):
    data = list(map(int, input().split()))
    time[i] = data[0] # 첫 번째 수는 [ 시간 정보 ]를 담고 있음
   
    for x in data[1:-1]: # 인덱스 '1'부터 '-2'요소(끝 원소 제외한 나머지) 까지 . ex) 10 1 -1 이면 '1' 만 출력. 
        indegree[i] += 1
        graph[x].append(i) # 방향성 도식화
        

# 위상 정렬 함수
def topology_sort():
    # deepcopy함수를 통하여 --> 'time 리스트' 변수의 값을 [ 복사 ].
    result = copy.deepcopy(time) # 알고리즘 [ 수행 결과 ]를 담을 리스트
    q = deque() # '큐 기능'을 위한 deque 라이브러리 사용

    # 처음 시작할 때는 [ 진입차수가 0인 노드 ]를 '큐에 삽입'
    for i in range(1, v + 1):
        if indegree[i] == 0:
            q.append(i)
    
    
    # 큐가 '빌 때까지' 반복
    while q:
        # 큐에서 원소 꺼내기
        now = q.popleft()
        # [ 해당 원소와 ] 연결된 ' 노드들의 진입차수 '에서 '1 빼기'
        for i in graph[now]:
            result[i] = max(result[i], result[now] + time[i])
            indegree[i] -= 1
            # 새롭게 [ ** 진입차수 **가 '0이' 되는 노드를 ] '큐에 삽입'
            if indegree[i] == 0:
                q.append(i)

    # 위상 정렬을 수행한 [ 결과 출력 ]
    for i in range(1, v + 1):
        print(i,"번 강의 수강 최소 시간: ",result[i])
topology_sort()
