input: Write a python function to calculate the shortest path from source to destination using Dijkstra's Algorithm.
  assert dijkstra({'a': {'b': 10, 'c': 3}, 'b': {'c': 1, 'd': 2}, 'c': {'b': 4, 'd': 8, 'e': 2}, 'd': {'e': 7}, 'e': {'d': 9}}, 'a', 'd') == 9
  assert dijkstra({'a': {'b': 1, 'c': 4}, 'b': {'c': 2, 'd': 5}, 'c': {'d': 1}, 'd': {}}, 'a', 'd') == 6
  assert dijkstra({'a': {'b': 2}, 'b': {'c': 3}, 'c': {'d': 1}, 'd': {}}, 'a', 'd') == 6
output: def dijkstra(graph, source, destination):
      import heapq
  
      # Priority queue to store (cost, vertex) tuples
      pq = [(0, source)]
      # Dictionary to store the minimum distance to each vertex
      distances = {vertex: float('inf') for vertex in graph}
      distances[source] = 0
  
      while pq:
          current_distance, current_vertex = heapq.heappop(pq)
  
          if current_vertex == destination:
              return current_distance
  
          if current_distance > distances[current_vertex]:
              continue
  
          for neighbor, weight in graph[current_vertex].items():
              distance = current_distance + weight
  
              if distance < distances[neighbor]:
                  distances[neighbor] = distance
                  heapq.heappush(pq, (distance, neighbor))
  
      return float('inf')  # If destination is not reachable