private static List<String> findCycle(List<Node> nodes) {
        var cyclicGraph = new Graph<String>();
        for (var node : nodes) {
            for (var adjacent : node.usedComponents()) {
                cyclicGraph.edge(node.componentId().stringValue(),
                                 adjacent.componentId().stringValue());
            }
        }
        return new CycleFinder<>(cyclicGraph).findCycle();
    }
The returned list is the nodes from the graph bottom-up.

For each iteration, the algorithm finds the components that are not "wanted by" any other component,
and prepends those components into the resulting 'sorted' list. Hence, the first element in the returned
list is the component that is directly or indirectly wanted by "most" other components.

@return A list where a earlier than b in the list implies that there is no path from a to b
container-core/src/main/java/com/yahoo/container/di/componentgraph/core/ComponentGraph.java