// Complete the printShortestPath function below.
        static void printShortestPath(int n, int i_start, int j_start, int i_end, int j_end)
        {
            // Print the distance along with the sequence of moves.

            // move order [Name] (dx, dy) -  UL (-1,2), UR (1,2), R (2,0), LR (1,-2), LL (-1,-2), L (-2,0)

            var grid = new GridIndex(n);

            var startNode = grid.GetNode(i_start, j_start);

            startNode.Distance = 0;

            var openNodesQueue = new Queue <Node>();

            openNodesQueue.Enqueue(startNode);

            Node endNode = null;

            while (endNode == null && openNodesQueue.Any())
            {
                var activeNode = openNodesQueue.Dequeue();
                foreach (var move in Movements)
                {
                    var nextNode = grid.TryGetNode(activeNode, move);
                    if (nextNode == null)
                    {
                        continue;
                    }
                    if (nextNode.IsVisited)
                    {
                        continue;
                    }

                    nextNode.PreviousNode = activeNode;
                    nextNode.Distance     = activeNode.Distance + 1;
                    nextNode.Move         = move;
                    if (nextNode.IsPosition(i_end, j_end))
                    {
                        endNode = nextNode;
                        break;
                    }

                    openNodesQueue.Enqueue(nextNode);
                }
            }

            if (endNode == null)
            {
                Console.WriteLine("Impossible");
            }
            else
            {
                Console.WriteLine(endNode.Distance);
                var moveHistory = endNode.GetMoveHistory().Reverse()
                                  .Select(m => m.Name)
                                  .Aggregate((hist, mov) => $"{hist} {mov}");
                Console.WriteLine(moveHistory);
            }
        }