# Depth First Search
from collections import deque

N = int(input())
nodes = []
G ={}
is_visited = {}

for _ in range(N):
    lst = list(map(int, input().split()))
    idx = lst[0]
    nodes.append(idx)
    is_visited[idx] = False
    degree = lst[1]
    if degree > 0:
        G[idx] = lst[2:]
    else:
        G[idx] = []
        
d = {}  # 最初に訪問したときの発見時刻を記録する
f = {}  # 隣接リストを調べ終えた完了時刻を記録する
t = 1

def dfs(node):
    global t
    if (is_visited[node] == True):
        return
    is_visited[node] = True
    d[node] = t
    t += 1  # 時刻を一つ進める
    # 再帰探索
    for idx in G[node]:
        dfs(idx)
    f[node] = t
    t += 1  # 関数を終了するときにも+1する


for node in nodes:  # 孤立しているノードもあるためこうして対処
    dfs(node)

for node in nodes:
    print(node, d[node], f[node])
 from collections import deque N = int(input()) N int(input()) int input() input nodes = [] nodes [] G ={} G {} is_visited = {} is_visited {} for _ in range(N):
    lst = list(map(int, input().split()))
    idx = lst[0]
    nodes.append(idx)
    is_visited[idx] = False
    degree = lst[1]
    if degree > 0:
        G[idx] = lst[2:]
    else:
        G[idx] = []
         _ range(N) range N lst = list(map(int, input().split())) lst list(map(int, input().split())) list map(int, input().split()) map int input().split() ().split () input split idx = lst[0] idx lst[0] lst 0 nodes.append(idx) nodes.append nodes append idx is_visited[idx] = False is_visited[idx] is_visited idx False degree = lst[1] degree lst[1] lst 1 if degree > 0:
        G[idx] = lst[2:]
    else:
        G[idx] = []
         degree > 0 degree 0 G[idx] = lst[2:] G[idx] G idx lst[2:] lst 2: 2 G[idx] = [] G[idx] G idx [] d = {} d {} f = {} f {} t = 1 t 1 def dfs(node):
    global t
    if (is_visited[node] == True):
        return
    is_visited[node] = True
    d[node] = t
    t += 1  # 時刻を一つ進める
    # 再帰探索
    for idx in G[node]:
        dfs(idx)
    f[node] = t
    t += 1  # 関数を終了するときにも+1する dfs global t if (is_visited[node] == True):
        return
     is_visited[node] == True is_visited[node] is_visited node True return is_visited[node] = True is_visited[node] is_visited node True d[node] = t d[node] d node t t += 1 t 1 for idx in G[node]:
        dfs(idx)
     idx G[node] G node dfs(idx) dfs idx f[node] = t f[node] f node t t += 1 t 1 node node for node in nodes:  # 孤立しているノードもあるためこうして対処
    dfs(node) node nodes dfs(node) dfs node for node in nodes:
    print(node, d[node], f[node]) node nodes print(node, d[node], f[node]) print node d[node] d node f[node] f node is_visited = {} {} is_visited nodes = [] [] nodes idx = lst[0] lst[0] idx N = int(input()) int(input()) N def dfs(node):
    global t
    if (is_visited[node] == True):
        return
    is_visited[node] = True
    d[node] = t
    t += 1  # 時刻を一つ進める
    # 再帰探索
    for idx in G[node]:
        dfs(idx)
    f[node] = t
    t += 1  # 関数を終了するときにも+1する def dfs(node):
    global t
    if (is_visited[node] == True):
        return
    is_visited[node] = True
    d[node] = t
    t += 1  # 時刻を一つ進める
    # 再帰探索
    for idx in G[node]:
        dfs(idx)
    f[node] = t
    t += 1  # 関数を終了するときにも+1する dfs lst = list(map(int, input().split())) list(map(int, input().split())) lst t = 1 1 t f = {} {} f G ={} {} G degree = lst[1] lst[1] degree d = {} {} d
# Depth First Search
from collections import deque

N = int(input())
nodes = []
G ={}
is_visited = {}

for _ in range(N):
    lst = list(map(int, input().split()))
    idx = lst[0]
    nodes.append(idx)
    is_visited[idx] = False
    degree = lst[1]
    if degree > 0:
        G[idx] = lst[2:]
    else:
        G[idx] = []
        
d = {}  # 最初に訪問したときの発見時刻を記録する
f = {}  # 隣接リストを調べ終えた完了時刻を記録する
t = 1

def dfs(node):
    global t
    if (is_visited[node] == True):
        return
    is_visited[node] = True
    d[node] = t
    t += 1  # 時刻を一つ進める
    # 再帰探索
    for idx in G[node]:
        dfs(idx)
    f[node] = t
    t += 1  # 関数を終了するときにも+1する


for node in nodes:  # 孤立しているノードもあるためこうして対処
    dfs(node)

for node in nodes:
    print(node, d[node], f[node])

