Problem:
Diameter of a Tree

Given a tree T with non-negative weight, find the diameter of the tree.

The diameter of a tree is the maximum distance between two nodes in a tree.

Input

n
s1 t1 w1
s2 t2 w2
:
sn-1 tn-1 wn-1

The first line consists of an integer n which represents the number of nodes in the tree. Every node has a unique ID from 0 to n-1 respectively.

In the following n-1 lines, edges of the tree are given.

si and ti represent end-points of the i-th edge (undirected) and wi represents the weight (distance) of the i-th edge.

Output

Print the diameter of the tree in a line.

Constraints

1 ≤ n ≤ 100,000

0 ≤ wi ≤ 1,000

Sample Input 1

4
0 1 2
1 2 1
1 3 3

Sample Output 1

5

Sample Input 2

4
0 1 1
1 2 2
2 3 4

Sample Output 2

7

Solution in C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;


namespace GRL5_A
{
    class Edge
    {
        public int t;
        public int w;
        public Edge(int t,int w)
        {
            this.t = t;
            this.w = w;
        }
    }
   
    class Program
    {
        const int MAX = 100000;
        const int INF = 1 << 30;
        static int n;
        static int[] d;
        static List<Edge>[] G = Enumerable.Range(0, MAX).Select(i =>new List<Edge>()).ToArray();
        static void Main(string[] args)
        {
            n = scan[0];
            for (int i = 0; i < n-1; i++)
            {
                var t = scan;
                G[t[0]].Add(new Edge(t[1], t[2]));
                G[t[1]].Add(new Edge(t[0], t[2]));
            }
            bfs(0);
            bfs(Array.IndexOf(d, d.Where(s => s != INF).Max()));
            Console.WriteLine(d.Where(s => s != INF).Max());
        }
        static void bfs(int s)
        {
            d = Enumerable.Repeat(INF, MAX).ToArray();
            var Q = new Queue<int>();
            Q.Enqueue(s);
            d[s] = 0;
            int u;
            while(Q.Any())
            {
                u = Q.Dequeue();
                for (int i = 0; i < G[u].Count; i++)
                {
                    Edge e = G[u][i];
                    if (d[e.t] == INF)
                    {
                        d[e.t] = d[u] + e.w;
                        Q.Enqueue(e.t);
                    }
                }
            }
        }
        static int[] scan { get { return Array.ConvertAll(Console.ReadLine().Split(), int.Parse); } }
    }
}