public void FindShortestPath(string filePath, string startWord, string endWord, string resultFilePath)
        {
            _logger.Info("Loading file...");
            IEnumerable <string> words = _fileLoader.LoadFile(filePath);

            _logger.Info("File loaded");

            _logger.Info("Building graph...");
            ConcurrentDictionary <string, List <string> > graph = _graphFactory.BuildGraph(words);

            _logger.Info("Graph built");


            int numberOfMatching = graph.Count(c => c.Value.Any());

            _logger.Info($"system has found {numberOfMatching} dead end nodes of {graph.Count()}");

            _logger.Info("Trying to calculate critical path...");
            List <string> criticalPath;

            if (_shortestPathAlgorithm.TryFindShortestPath(graph, startWord, endWord, out criticalPath))
            {
                _logger.Info("Critical path found");
                _logger.Info($"Critical path is: {string.Join(" -> ", criticalPath)}");

                _logger.Info("Saving file...");
                _fileLoader.SaveFile(criticalPath, resultFilePath);
                _logger.Info("Save complete");
            }
            else
            {
                _logger.Error($"Failed to find a path between {startWord} and {endWord}");
            }
        }