#include <chrono>
#include <fstream>
#include <iostream>
#include <vector>
struct Route
{
int dest;
int cost;
} ;
using Node = std:: vector < Route> ;
std:: vector < char > visited;
std:: vector < Node> nodes;
static
int GetLongestPath( int index)
{
int max = 0 ;
visited[ index] = true ;
for ( auto neighbour : nodes[ index] )
{
if ( ! visited[ neighbour.dest ] )
{
auto dist = neighbour.cost + GetLongestPath( neighbour.dest ) ;
max = std:: max ( max, dist) ;
}
}
visited[ index] = false ;
return max;
}
int main( )
{
std:: ifstream in( "agraph" ) ;
int num_nodes;
in >> num_nodes;
nodes.resize ( num_nodes) ;
visited.resize ( num_nodes) ;
int index;
int neighbour;
int cost;
while ( in >> index >> neighbour >> cost)
{
nodes[ index] .push_back ( { neighbour, cost} ) ;
}
auto start = std:: chrono :: steady_clock :: now ( ) ;
auto len = GetLongestPath( 0 ) ;
auto stop = std:: chrono :: steady_clock :: now ( ) ;
auto ms = std:: chrono :: duration_cast < std:: chrono :: milliseconds > ( stop - start) ;
std:: cout << len << " LANGUAGE C++/" << COMPILER << " " << ms.count ( ) << "\n " ;
}
I2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPGZzdHJlYW0+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KCnN0cnVjdCBSb3V0ZQp7CiAgICBpbnQgZGVzdDsKICAgIGludCBjb3N0Owp9OwoKdXNpbmcgTm9kZSA9IHN0ZDo6dmVjdG9yPFJvdXRlPjsKCnN0ZDo6dmVjdG9yPGNoYXI+IHZpc2l0ZWQ7CnN0ZDo6dmVjdG9yPE5vZGU+IG5vZGVzOwoKc3RhdGljCmludCBHZXRMb25nZXN0UGF0aChpbnQgaW5kZXgpCnsKICAgIGludCBtYXggPSAwOwogICAgdmlzaXRlZFtpbmRleF0gPSB0cnVlOwoKICAgIGZvciAoYXV0byBuZWlnaGJvdXIgOiBub2Rlc1tpbmRleF0pCiAgICB7CiAgICAgICAgaWYgKCF2aXNpdGVkW25laWdoYm91ci5kZXN0XSkKICAgICAgICB7CiAgICAgICAgICAgIGF1dG8gZGlzdCA9IG5laWdoYm91ci5jb3N0ICsgR2V0TG9uZ2VzdFBhdGgobmVpZ2hib3VyLmRlc3QpOwogICAgICAgICAgICBtYXggPSBzdGQ6Om1heChtYXgsIGRpc3QpOwogICAgICAgIH0KICAgIH0KCiAgICB2aXNpdGVkW2luZGV4XSA9IGZhbHNlOwogICAgcmV0dXJuIG1heDsKfQoKCmludCBtYWluKCkKewogICAgc3RkOjppZnN0cmVhbSBpbigiYWdyYXBoIik7CgogICAgaW50IG51bV9ub2RlczsKICAgIGluID4+IG51bV9ub2RlczsKICAgIG5vZGVzLnJlc2l6ZShudW1fbm9kZXMpOwogICAgdmlzaXRlZC5yZXNpemUobnVtX25vZGVzKTsKCiAgICBpbnQgaW5kZXg7CiAgICBpbnQgbmVpZ2hib3VyOwogICAgaW50IGNvc3Q7CiAgICB3aGlsZSAoaW4gPj4gaW5kZXggPj4gbmVpZ2hib3VyID4+IGNvc3QpCiAgICB7CiAgICAgICAgbm9kZXNbaW5kZXhdLnB1c2hfYmFjayh7bmVpZ2hib3VyLCBjb3N0fSk7CiAgICB9CgogICAgYXV0byBzdGFydCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOwogICAgYXV0byBsZW4gPSBHZXRMb25nZXN0UGF0aCgwKTsKICAgIGF1dG8gc3RvcCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOwogICAgYXV0byBtcyA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KHN0b3AgLSBzdGFydCk7CiAgICBzdGQ6OmNvdXQgPDwgbGVuIDw8ICIgTEFOR1VBR0UgQysrLyIgPDwgQ09NUElMRVIgPDwgIiAiIDw8IG1zLmNvdW50KCkgPDwgIlxuIjsKfQ==