pred[1...n] = [null, null, ..., null]
state[1...n] = [unseen, unseen, ..., unseen]
disc[1...n] = [0, 0, ..., 0]
fin[1...n] = [0, 0, ..., 0]
time = 0

def FullDFS(adjlist[1...n]):
	for v in 1..m:
		if state[v] == unseen:
			DFS(adjlist, v)

def DFS(adjlist[1..n], v):
	# Update time and set discover time
	state[v] = seen
	time = time + 1
	disc[v] = time

	# Process everything else
	for each w in adjlist[v]:
		if state[w] == unseen:
			pred[w] = v
			DFS(adjlist, w)

	# Update time and set finishing time
	state[v] = complete
	time = time + 1
	fin[v] = time