       return
     }
 
-    if !reachability[currentVertexIndex].contains(startVertexIndex) {
+    // first check - current vertex find ALL cycles via current vertex.
+    // Second check - current vertex guaranted not cycles via startVertexIndex.
+    if currentVertexIndex < startVertexIndex || !reachability[currentVertexIndex].contains(startVertexIndex) {
       return
     }
 
     let visitedVertices = visitedVertices + [currentVertexIndex]
-
-    counterVertices += 1
-    maxDepth = max(maxDepth, visitedVertices.count)
 
     for (edge, toIndices) in graph.adjacencyList[currentVertexIndex] {
       let visitedEdges = visitedEdges + [edge]

  }


  private func checkGraphCyclesVertices(cycles: [Cycle]) -> Bool {
    var successful: Bool = true
    for cycle in cycles {
      assert(cycle.vertexIndices.count >= 1)

    return visited
  }

  private func findCycles(currentVertexIndex: Int,
                          visitedVertices: [Int], // need order for subcycle
                          visitedEdges: [DIEdge]) {
    if currentVertexIndex == startVertexIndex && !visitedVertices.isEmpty {
      assert(visitedVertices.count == visitedEdges.count)

      result.insert(Cycle(vertexIndices: visitedVertices, edges: visitedEdges))
      return
    }

