/** Auxiliary methods for specializing a generic DFS */
  protected void initResult() {} // Initializes result (called first)
  protected void startVisit(Vertex v) {} // Called when we first visit v
  protected void finishVisit(Vertex v) {} // Called when we finish with v
  protected void traverseDiscovery(Edge e, Vertex from) {} // Discovery edge
  protected void traverseBack(Edge e, Vertex from) {} // Back edge
  protected boolean isDone() { return false; } // Is DFS done early?
  protected Object result() { return new Object(); } // The result of the DFS