def dijkstra(start, end):
    data = Data_Manager()
    cities = data.get_cities()
    D = {}
    P = {}
    for city in cities:
        D[city] = float('inf')
        P[city] = ""
        
    D[start] = 0
    remain_cities = cities
    
    while len(remain_cities) > 0:
        short = None
        city = ''
        for x in remain_cities:
            if short == None:
                short = D[x]
                city = x
            elif D[x] < short:
                short = D[x]
                city = x
        remain_cities.remove(city)
        connects = data.get_conn(city)

        for x in connects:
            #|||(weight, type, cost, time)
            if x[1] == city:
                if D[x[2]] == float('inf'):
                    D[x[2]] = D[city] + x[0]
                    P[x[2]] = city
                elif D[x[2]] > D[city] + x[0]:
                    D[x[2]] = D[city] + x[0]
                    P[x[2]] = city
                    
    path = []
    node = end
    while node != start:
        if path.count(node) == 0:
            path.insert(0, node)
            node = P[node]
        else:
            break
        
    path.insert(0, start)
    return (D[end], path)