graph = { 0 : [1], 1 : [2], 2 : [3], 3 : [4], 4 : [1] }
# https://algocoding.wordpress.com/2015/04/02/detecting-cycles-in-a-directed-graph-with-dfs-python/
def cycle_existe(G):                    
    color = { u : "white" for u in G  }  # Noeuds tous blancs
    trouve_cycle = [False]                 
 
    for u in G:                          # On visite tous les noeuds
        if color[u] == "white":
            dfs_visite(G, u, color, trouve_cycle)
        if trouve_cycle[0]:
            break
    return trouve_cycle[0]
 
def dfs_visite(G, u, color, trouve_cycle):
    if trouve_cycle[0]:                         
        return
    color[u] = "gray"                  
    for v in G[u]:                             
        if color[v] == "gray":                 
            trouve_cycle[0] = True       
            return
        if color[v] == "white":                
            dfs_visite(G, v, color, trouve_cycle)
    color[u] = "black"   

print(cycle_existe(graph))