// Auxiliary methods (all initially null) for specializing a generic DFS 
  /** Initializes result (called first, once per vertex visited). */
  protected void initResult() {}          
  /** Called when we encounter a vertex (v). */
  protected void startVisit(Vertex v) {}  
  /** Called after we finish the visit for a vertex (v). */
  protected void finishVisit(Vertex v) {} 
  /** Called when we traverse a discovery edge (e) from a vertex (from). */
  protected void traverseDiscovery(Edge e, Vertex from) {} 
  /** Called when we traverse a back edge (e) from a vertex (from). */
  protected void traverseBack(Edge e, Vertex from) {}
  /** Determines whether the traversal is done early. */
  protected boolean isDone() { return false; /* default value */ } 
  /** Returns a result of a visit (if needed). */
  protected Object result() { return null; /* default value */ }