Pseudocode
mark all verices white
for each vertex s:
if s is white:
if has-cycle(s): return True
return False
has-cycle(u):
mark u gray
for each v in u's adjacency list:
if v is white:
predecessor(v) = u
if has-cycle(v): return True
elif v is gray and v is not predecessor(u):
return True
mark u black
return False