void TestTopologicalSortOnBigAcyclicGraphs(const std::vector<Edge> &list_of_edges, int vertices_amount) {
    try {
	std::vector<Edge> copy_list_of_edges = list_of_edges;  
        std::vector<int> topologically_ordered_vertices = GetTopologicallyOrderedVerties(copy_list_of_edges, vertices_amount);

	random_shuffle(copy_list_of_edges.begin(), copy_list_of_edges.end());
        std::vector<int> topologically_ordered_vertices_after_shuffle = GetTopologicallyOrderedVerties(copy_list_of_edges, vertices_amount);

	if (topologically_ordered_vertices_after_shuffle != topologically_ordered_vertices) throw std::logic_error("FAIL");
    } catch (const std::exception& ex) {
        throw std::logic_error("TestTopologicalSortOnBigAcyclicGraphs : " + std::string(ex.what()));
    }
}
inline void StressTestTopologicalSort(const std::vector<Edge> &list_of_edges, int vertices_amount) {

    try {
        if (StupidIsSircle(vertices_amount, list_of_edges)) return;

        std::vector<int> topologically_ordered_vertices = GetTopologicallyOrderedVerties(list_of_edges, vertices_amount);
        if (topologically_ordered_vertices.size() != vertices_amount) throw std::logic_error("FAIL");

	auto graph = MakeCompactGraph(list_of_edges, vertices_amount);
        for (int i = 0; i < topologically_ordered_vertices.size() - 1; ++i) {
            for (int j = i + 1; j < topologically_ordered_vertices.size(); ++j) {
                if (graph->HasEdge(topologically_ordered_vertices[j], topologically_ordered_vertices[i]))
                     throw std::logic_error("FAIL");
            }
        } 
    } catch (const std::exception& ex) {
        throw std::logic_error("TestTopologicalSort: " + std::string(ex.what()));
    }
}