- import sys 
- from collections import deque, defaultdict 
-   
-   
- def bfs(graph, start, visited): 
-     queue = deque([(start, 0)]) 
-     visited.add(start) 
-     max_depth = 0 
-   
-     while queue: 
-         node, depth = queue.popleft() 
-         max_depth = max(max_depth, depth) 
-   
-         for neighbor in graph[node]: 
-             if neighbor not in visited: 
-                 visited.add(neighbor) 
-                 queue.append((neighbor, depth + 1)) 
-   
-     return max_depth 
-   
-   
- # Read the input from stdin 
- def read_input(): 
-     input = sys.stdin.read().splitlines() 
-     idx = 0 
-     graphs = [] 
-   
-     while idx < len(input): 
-         n = int(input[idx]) 
-         idx += 1 
-         graph = defaultdict(list) 
-   
-         for i in range(n): 
-             line = list(map(int, input[idx].split())) 
-             graph[i] = line 
-             idx += 1 
-   
-         graphs.append(graph) 
-   
-     return graphs 
-   
-   
- def process_graph(graph): 
-     visited = set() 
-     heights = [] 
-   
-     for node in graph: 
-         if node not in visited: 
-             height = bfs(graph, node, visited) 
-             heights.append(height) 
-   
-     return heights 
-   
-   
- input = sys.stdin.read().splitlines() 
- index = 0 
- graphs = [] 
-   
- while  index < len(input): 
-     n = int(input[index]) 
-     index+= 1 
-     graph = defaultdict(list) 
-   
-     for i in range(n): 
-         line = list(map(int, input[index].split())) 
-         graph[i] = line 
-         index += 1 
-   
-     graphs.append(graph) 
-   
- results = [] 
- for graph in graphs: 
-     heights = process_graph(graph) 
-     results.append(heights) 
-   
- for heights in results: 
-     print(" ".join(map(str, heights))) 
				aW1wb3J0IHN5cwpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZSwgZGVmYXVsdGRpY3QKCgpkZWYgYmZzKGdyYXBoLCBzdGFydCwgdmlzaXRlZCk6CiAgICBxdWV1ZSA9IGRlcXVlKFsoc3RhcnQsIDApXSkKICAgIHZpc2l0ZWQuYWRkKHN0YXJ0KQogICAgbWF4X2RlcHRoID0gMAoKICAgIHdoaWxlIHF1ZXVlOgogICAgICAgIG5vZGUsIGRlcHRoID0gcXVldWUucG9wbGVmdCgpCiAgICAgICAgbWF4X2RlcHRoID0gbWF4KG1heF9kZXB0aCwgZGVwdGgpCgogICAgICAgIGZvciBuZWlnaGJvciBpbiBncmFwaFtub2RlXToKICAgICAgICAgICAgaWYgbmVpZ2hib3Igbm90IGluIHZpc2l0ZWQ6CiAgICAgICAgICAgICAgICB2aXNpdGVkLmFkZChuZWlnaGJvcikKICAgICAgICAgICAgICAgIHF1ZXVlLmFwcGVuZCgobmVpZ2hib3IsIGRlcHRoICsgMSkpCgogICAgcmV0dXJuIG1heF9kZXB0aAoKCiMgUmVhZCB0aGUgaW5wdXQgZnJvbSBzdGRpbgpkZWYgcmVhZF9pbnB1dCgpOgogICAgaW5wdXQgPSBzeXMuc3RkaW4ucmVhZCgpLnNwbGl0bGluZXMoKQogICAgaWR4ID0gMAogICAgZ3JhcGhzID0gW10KCiAgICB3aGlsZSBpZHggPCBsZW4oaW5wdXQpOgogICAgICAgIG4gPSBpbnQoaW5wdXRbaWR4XSkKICAgICAgICBpZHggKz0gMQogICAgICAgIGdyYXBoID0gZGVmYXVsdGRpY3QobGlzdCkKCiAgICAgICAgZm9yIGkgaW4gcmFuZ2Uobik6CiAgICAgICAgICAgIGxpbmUgPSBsaXN0KG1hcChpbnQsIGlucHV0W2lkeF0uc3BsaXQoKSkpCiAgICAgICAgICAgIGdyYXBoW2ldID0gbGluZQogICAgICAgICAgICBpZHggKz0gMQoKICAgICAgICBncmFwaHMuYXBwZW5kKGdyYXBoKQoKICAgIHJldHVybiBncmFwaHMKCgpkZWYgcHJvY2Vzc19ncmFwaChncmFwaCk6CiAgICB2aXNpdGVkID0gc2V0KCkKICAgIGhlaWdodHMgPSBbXQoKICAgIGZvciBub2RlIGluIGdyYXBoOgogICAgICAgIGlmIG5vZGUgbm90IGluIHZpc2l0ZWQ6CiAgICAgICAgICAgIGhlaWdodCA9IGJmcyhncmFwaCwgbm9kZSwgdmlzaXRlZCkKICAgICAgICAgICAgaGVpZ2h0cy5hcHBlbmQoaGVpZ2h0KQoKICAgIHJldHVybiBoZWlnaHRzCgoKaW5wdXQgPSBzeXMuc3RkaW4ucmVhZCgpLnNwbGl0bGluZXMoKQppbmRleCA9IDAKZ3JhcGhzID0gW10KCndoaWxlICBpbmRleCA8IGxlbihpbnB1dCk6CiAgICBuID0gaW50KGlucHV0W2luZGV4XSkKICAgIGluZGV4Kz0gMQogICAgZ3JhcGggPSBkZWZhdWx0ZGljdChsaXN0KQoKICAgIGZvciBpIGluIHJhbmdlKG4pOgogICAgICAgIGxpbmUgPSBsaXN0KG1hcChpbnQsIGlucHV0W2luZGV4XS5zcGxpdCgpKSkKICAgICAgICBncmFwaFtpXSA9IGxpbmUKICAgICAgICBpbmRleCArPSAxCgogICAgZ3JhcGhzLmFwcGVuZChncmFwaCkKCnJlc3VsdHMgPSBbXQpmb3IgZ3JhcGggaW4gZ3JhcGhzOgogICAgaGVpZ2h0cyA9IHByb2Nlc3NfZ3JhcGgoZ3JhcGgpCiAgICByZXN1bHRzLmFwcGVuZChoZWlnaHRzKQoKZm9yIGhlaWdodHMgaW4gcmVzdWx0czoKICAgIHByaW50KCIgIi5qb2luKG1hcChzdHIsIGhlaWdodHMpKSk=