input: Write a python function to find the shortest path in a graph.
  assert solution(0, 3) == [0, 1, 3]
  assert solution(1, 2) == [1, 2]
  assert solution(2, 3) == [2, 3]
  assert solution(0, 2) == [0, 2]
output: def solution(start, end):
      from collections import deque, defaultdict
      
      graph = defaultdict(list)
      edges = [(0, 1), (1, 3), (0, 2), (2, 3), (1, 2)]  # Sample graph edges
      
      for (u, v) in edges:
          graph[u].append(v)
          graph[v].append(u)
      
      def bfs(start, end):
          queue = deque([[start]])
          visited = set()
          
          while queue:
              path = queue.popleft()
              node = path[-1]
              
              if node in visited:
                  continue
              
              for neighbour in graph[node]:
                  new_path = list(path)
                  new_path.append(neighbour)
                  queue.append(new_path)
                  
                  if neighbour == end:
                      return new_path
              
              visited.add(node)
      
      return bfs(start, end)