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 CSharpSample01
{

    class Edge
    {
        internal int t;
        internal int w;

        public Edge(int t, int w)
        {
            this.t = t;
            this.w = w;
        }

    }



    class Program
    {

        static int[] d;    
        static int n;
        static List<Edge>[] g;
        const int INF = int.MaxValue;

        
        static void Bfs(int s)
        {
            for (int i = 0; i < n; i++)
            {
                d[i] = INF;
            }

            var q = new Queue<int>();
            q.Enqueue(s);
            d[s] = 0;

            while(q.Count != 0)
            {
                int 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 void Solve()
        {

            Bfs(0);

            int x = 0;
            int max = -1;
            for(int i = 0; i < n; i++)
            {
                if(d[i] == INF)
                {
                    continue;
                }
                if(max < d[i])
                {
                    x = i;
                    max = d[i];
                }
            }

            Bfs(x);
            
            max = -1;
            for(int i = 0; i < n; i++)
            {
                if(d[i] == INF)
                {
                    continue;
                }
                max = Math.Max(max, d[i]);
            }

            Console.WriteLine(max);

        }

        
        static void Main(string[] args)
        {
            n = int.Parse(Console.ReadLine());


            g = new List<Edge>[n];            
            d = new int[n];

            for(int i = 0; i < n; i++)
            {
                g[i] = new List<Edge>();
            }


            for(int i = 0; i < n - 1; i++)
            {
                string[] str = Console.ReadLine().Split(' ');
                int s = int.Parse(str[0]);
                int t = int.Parse(str[1]);
                int w = int.Parse(str[2]);

                g[s].Add(new Edge(t, w));
                g[t].Add(new Edge(s, w));
            }

            Solve();

        }
    }
}