public static void Client()
        {
            var vertices = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
            var edges    = new[]
            {
                Tuple.Create(1, 2), Tuple.Create(1, 3), Tuple.Create(2, 4),
                Tuple.Create(3, 5), Tuple.Create(3, 6), Tuple.Create(4, 7),
                Tuple.Create(5, 7), Tuple.Create(5, 8), Tuple.Create(5, 6),
                Tuple.Create(8, 9), Tuple.Create(9, 10), Tuple.Create(8, 10),
            };

            var graph = new Graph <int>(vertices, edges);
            var bfs   = new Bfs();

            var path = new List <int>();

            // Tracing BFS path
            Console.WriteLine(string.Join(", ", bfs.ApplyBfs(graph, 1, v => path.Add(v))));
            // 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

            Console.WriteLine(string.Join(", ", path));
            // 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

            // Find shorest path
            var startVertex  = 1;
            var shortestPath = bfs.ShortestPathFunction(graph, startVertex);

            foreach (var vertex in vertices)
            {
                Console.WriteLine("shortest path to {0,2}: {1}",
                                  vertex, string.Join(", ", shortestPath(vertex)));
            }
            //shortest path to  1: 1
            //shortest path to  2: 1, 2
            //shortest path to  3: 1, 3
            //shortest path to  4: 1, 2, 4
            //shortest path to  5: 1, 3, 5
            //shortest path to  6: 1, 3, 6
            //shortest path to  7: 1, 2, 4, 7
            //shortest path to  8: 1, 3, 5, 8
            //shortest path to  9: 1, 3, 5, 8, 9
            //shortest path to 10: 1, 3, 5, 8, 10
        }