Go: package main

import "fmt"

type node struct {
	id, d, v int
	adj      []node
}

var n int
var seen []bool
var graph []node

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func dfs(v, t int) int {
	// fmt.Printf("dfs(v %d, t %d) en:\n", v, t)
	seen[v] = true
	graph[v].v = t
	tt := t
	for _, vv := range graph[v].adj {
		if !seen[vv.id] {
			tt = max(tt, dfs(vv.id, tt+1))
		}
	}
	graph[v].d = tt + 1
	// fmt.Printf("dfs(v %d, t %d) ex: d %d\n", v, t, graph[v].d)
	return graph[v].d
}

func main() {
	fmt.Scan(&n)
	graph = make([]node, n+1)
	for i := 1; i <= n; i++ {
		var u, k, v int
		fmt.Scan(&u, &k)
		graph[u].id = u
		// 頂点uはk個の隣接頂点を持っている
		for j := 0; j < k; j++ {
			fmt.Scan(&v)
			var t node
			t.id = v
			graph[u].adj = append(graph[u].adj, t)
		}
	}
	// fmt.Println("n", n, "graph", graph)
	seen = make([]bool, n+1)
	// t := dfs(1, 1)
	v, t := 1, 1
	done := false
	for !done {
		tt := dfs(v, t)
		done = true
		for i := range seen {
			if !seen[i] {
				done = false
				v = graph[i].id
				t = tt
				break
			}
		}
	}
	for i := 1; i <= n; i++ {
		fmt.Printf("%d %d %d\n", i, graph[i].v, graph[i].d)
	}
}

C++: #include<bits/stdc++.h>
using namespace std;
#define int long long
vector<vector<int> > G;
int d[111],f[111],u[111];
void dfs(int v,int& p){
  if(u[v]) return;
  u[v]=1;
  sort(G[v].begin(),G[v].end());
  d[v]=++p;
  for(int u:G[v]) dfs(u,p);
  f[v]=++p;
}
signed main(){
  int n;
  cin>>n;
  G.resize(n,vector<int>());
  for(int i=0;i<n;i++){
    int u,k;
    cin>>u>>k;
    u--;
    for(int j=0;j<k;j++){
      int c;
      cin>>c;
      c--;
      G[u].push_back(c);
    }
  }
  int p=0;
  for(int i=0;i<n;i++)
    if(!u[i]) dfs(i,p);
  for(int i=0;i<n;i++) cout<<i+1<<" "<<d[i]<<" "<<f[i]<<endl;;
  return 0;
}

C++: #include<iostream>
int a[101][101]={0};
int d[101]={0};//vを最初に発見した発見時刻
int f[101]={0};//vの隣接リストを調べ終えた完了時刻
int used[101]={0};//見つけたかどうか
int t=1;
int n;

void search(int i){
  d[i]=t++;
  used[i]++;
  int j;
  for(j=0; j<n; j++){
    if(a[i][j]==1 and used[j]==0){
      search(j);
    }
  }
  f[i]=t++;
}
int main(){
  int k;
  int u,v;
  std::cin>>n;
  int i,j;
  //行列の初期化
  for(i=0; i<n; i++){
    for(j=0; j<n; j++){
      a[i][j]=0;
    }
  }
  for(i=0; i<n; i++){
    std::cin>>u;
    std::cin>>k;
    for(j=0; j<k; j++){
      std::cin>>v;
      a[u-1][v-1]=1;
    }
  }
  for(i=0; i<n; i++){
    if(used[i]==0){
      search(i);
    }
  }
  for(i=0; i<n; i++){
    std::cout<<i+1<<" "<<d[i]<<" "<<f[i]<<"\n";
  }
  return 0;
}

C++: #include <bits/stdc++.h>
using namespace std;
using ll = long long;

int N;
int G[105][105];
int d[105], f[105];
int used[105];

int dfs(ll v, ll t) {
  used[v] = true;
  d[v] = t;
  for (ll i = 0; i < N; i++) {
    if (!used[i] && G[v][i]) {
      t = dfs(i, t + 1);
    }
  }
  return f[v] = t + 1;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);

  cin >> N;
  for (ll i = 0; i < N; i++) {
    ll U, K; cin >> U >> K;
    for (ll j = 0; j < K; j++) {
      ll v; cin >> v; v--;
      G[i][v] = 1;
    }
  }

  int t = 0;
  for (ll i = 0; i < N; i++) {
    if (!used[i]) {
      t = dfs(i, t + 1);
    }
  }

  for (ll i = 0; i < N; i++) {
    cout << (i + 1) << ' ' << d[i] << ' ' << f[i] << '\n';
  }
  return 0;
}

C++: #include <utility>
#include <math.h>
#include <vector>
#include <algorithm>
#include <string>
#include <iostream>

using namespace std;

int c;
int a[100][100];
int times = 0;
vector<pair<int,int> > v;

vector<int> search(int node)
{
    vector<int> r;
    for(int i = 0;i<c;i++)
    {
        if(a[node][i] == 1)
            r.push_back(i);
    }
    return r;
}

int deep(int node)
{
    if(v[node].first == 0)
    {
        v[node].first = ++times;
        vector<int> r = search(node);
        for(int i = 0;i<r.size();i++)
        {
            deep(r[i]);
            
        }
        v[node].second = ++times;
    }
    else
        return -1;

    return 1;
}

int main() {

    cin >> c;
    for(int i= 0;i<c;i++)
        for(int j = 0;j<c;j++)
            a[i][j] = 0;
    v = vector<pair<int,int> >(c,{0,0});
    for(int i = 0; i<c;i++)
    {
        int rem[2];
        cin >> rem[0] >> rem[1];
        for(int j = 0;j<rem[1];j++)
        {
            int rem11;
            cin >> rem11;
            a[i][rem11-1] = 1;
        }
    }//cin fin
    deep(0);
    
    for(int i = 0; i<c;i++)
    {
        cout << i+1 << " " << v[i].first << " " << v[i].second << endl;
    }
    
    return 0;
}

C++: #include <iostream>
#include <vector>

using namespace std;

int verticisNumber;
vector<int> d, f;
vector< vector<int> > g;

void dfs(int cur) {
    static int time = 0;
    time++;
    d[cur] = time;

    for(int i = 0; i < verticisNumber; i++) {
        if(g[cur][i] && !d[i]) {
            dfs(i);
        }
    }

    time++;
    f[cur] = time;

    return;
}

int main() {
    cin >> verticisNumber;
    d.resize(verticisNumber); f.resize(verticisNumber);
    g.resize(verticisNumber);
    for(auto itr = g.begin(); itr != g.end(); itr++) {
        itr->resize(verticisNumber);
    }

    for(int i = 0; i < verticisNumber; i++) {
        int k, degree;
        cin >> k >> degree;
        for(int j = 0; j < degree; j++) {
            int dst;
            cin >> dst;
            g[i][dst - 1] = 1;
        }
    }

    for(int i = 0; i < verticisNumber; i++) {
        if(!d[i]) {
            dfs(i);
        }
    }

    for(int i = 0; i < verticisNumber; i++) {
        cout << i + 1 << " " << d[i] << " " << f[i] << endl;
    }
    return 0;
}

C++: #include <bits/stdc++.h>
using namespace std;
#define _GLIBCXX_DEBUG
typedef long long ll;
typedef pair<ll, ll> P;
typedef pair<pair<int, int>, int> PP;
// const ll INF = 1LL << 60;
const ll MOD = 1000000007;
const int INF = 1000000000;
const int MAX = 300000;

int GCD(int a, int b) { return b ? GCD(b, a % b) : a; }
//------------------------------------------------------------------------------------------------------------------------------
vector<vector<int>> G;
vector<int> d, f;
int t;
void dfs(int v) {
    d[v] = ++t;
    for(auto nv : G[v]){
        if(d[nv]>0){
            continue;
        }
        dfs(nv);
    }
    f[v] = ++t;
}

int main(void) { 
    int N;
    cin >> N;
    G.resize(N);
    d.resize(N);
    f.resize(N);
    for (int i = 0; i < N; i++) {
        int u, k;
        cin >> u >> k;
        u--;
        for(int i = 0; i < k; i++) {
            int v;
            cin >> v;
            v--;
            G[u].push_back(v);
        }
    }
    for(int i = 0; i < N; i++) {
        if(d[i]==0){
            dfs(i);
        }
    }
    for(int i = 0; i < N; i++) {
        cout << i + 1 << ' ' << d[i] << ' ' << f[i] << endl;
    }
}

C++: #include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <stack>

using namespace std;

int common_time=1,n;

int table[101][101],time_table[101][2];

void func(int node){
	if(time_table[node][0] == 0){
		time_table[node][0] = common_time++;
	}else{
		return;
	}
	for(int i=1;i<=n;i++){
		if(table[node][i] == 1){
			func(i);
		}
	}
	time_table[node][1] = common_time++;
}

int main(){
	int row,num,col;
	scanf("%d",&n);

	for(int i=1;i<=n;i++){
		for(int k=1;k<=n;k++){
			table[i][k]=0;
		}
		time_table[i][0]=0;
		time_table[i][1]=0;
	}

	for(int i=1;i<=n;i++){
		scanf("%d %d",&row,&num);
		for(int k=1;k<=num;k++){
			scanf("%d",&col);
			table[row][col]=1;
		}
	}

	for(int i=1;i<=n;i++){
		func(i);
	}

	for(int i=1;i<=n;i++){
		printf("%d %d %d\n",i,time_table[i][0],time_table[i][1]);
	}

    return 0;
}