private Pair<Graph<Node>, Integer> findMinSCSG(int startIndex) {
    /*
     * Per Johnson : "adjacency structure of strong component $K$ with least vertex in subgraph
     * of $G$ induced by $(s, s + 1, n)$". Or in contemporary terms: the strongly connected
     * component of the subgraph induced by $(v_1, \dotso ,v_n)$ which contains the minimum
     * (among those SCCs) vertex index. We return that index together with the graph.
     */
    initMinSCGState();

    List<Set<Node>> foundSCCs = findSCCS(startIndex);

    // find the SCC with the minimum index
    int minIndexFound = Integer.MAX_VALUE;
    Set<Node> minSCC = null;
    for (Set<Node> scc : foundSCCs) {
      for (Node Node : scc) {
        int t = toI(Node);
        if (t < minIndexFound) {
          minIndexFound = t;
          minSCC = scc;
        }
      }
    }
    if (minSCC == null) {
      return null;
    }

    // build a graph for the SCC found
    Map<Node, Set<Node>> resultGraph = new HashMap<>();

    for (Node Node : minSCC) {
      resultGraph.putIfAbsent(Node, new HashSet<>());
    }
    for (Node Node : minSCC) {
      for (Node w : minSCC) {
        if (containsEdge(myGraph, Node, w)) {
          resultGraph.get(Node).add(w);
        }
      }
    }

    Pair<Graph<Node>, Integer> result = Pair.create(toGraph(resultGraph), minIndexFound);
    clearMinSCCState();
    return result;
  }
private Pair<Graph<Node>, Integer> findMinSCSG(int startIndex)