public void traverse(int v) {	

		time += 1;		
		discovered[v] = Boolean.TRUE;
		entryTime[v] = time;
		
		proc.processVertexEarly(v);
		
		/* Temporary Edge pointer */
		EdgeNode p = g.getEdges().get(v); 
		while (p != null) {
			
			/* Grab other end point */
			int y = p.y;
			
			if (!discovered[y]) {
				
				/* Update parent relationship */
				parent[y] = v;
				
				finished = proc.processEdge(v, y);
				
				/* Recurse */
				traverse(y);				
				
			}else {
				
				if ((!processed[y] && (parent[v] != y)) || g.isDirected()) {
					finished = proc.processEdge(v, y);
				}
			}
			
			if (finished) {
				return;
			}
			
			p = p.next;
		}
		
		proc.processVertexLate(v);
		
		time += 1;
		exitTime[v] = time;
		
		processed[v] = Boolean.TRUE;
	}