def dijkstraM(G,s):
    infini = sum( sum( ligne ) for ligne in G ) + 1
    nb_sommets = len(G)

    s_connu = { s : [ 0 , [s] ] }
    s_inconnu = { k : [infini , ''] for k in range(nb_sommets) if k != s }

    for next in range(nb_sommets):
        if G[s][next]:
            s_inconnu[next] = [ G[s][next] , s ]

    print("\nPlus courts chemins de...")

    while s_inconnu and any( s_inconnu[k][0] < infini for k in s_inconnu ):
        u = min( s_inconnu , key = s_inconnu.get )
        longueur_u , precedent_u = s_inconnu[u]
        for v in range(nb_sommets):
            if G[u][v] and v in s_inconnu:
                d = longueur_u + G[u][v]
                if d < s_inconnu[v][0]:
                    s_inconnu[v] = [ d , u ]
        s_connu[u] = [ longueur_u , s_connu[precedent_u][1] + [u] ]
        del s_inconnu[u]
        print("Longueur",longueur_u,":", ' -> '.join( map( str , s_connu[u][1] ) ) )

    return s_connu

G = [
    [0 , 8 , 6 , 28 , 5 , 0 , 0 , 0 , 0 ],
    [8 , 0 , 9 , 0 , 15 , 0 , 0 , 0 , 0 ],
    [6 , 9 , 0 , 13 , 0 , 0 , 0 , 38 , 0 ],
    [28 , 0 , 13 , 0 , 14 , 0 , 21 , 17 , 0],
    [5 , 15 , 0 , 14 , 0 , 10 , 17 , 0 , 0],
    [0 , 0 , 0 , 0 , 10 , 0 , 19 , 0 , 0],
    [0 , 0 , 0 , 21 , 17 , 19 , 0 , 5 , 17],
    [0 , 0 , 38 , 17 , 0 , 0  ,5  , 0, 16],
    [0 , 0 , 0 , 0 , 0 , 0 , 17 , 16  , 0]
]

dijkstraM(G,0)