input: Write a function to implement breadth-first search and return the order of visited nodes.
  assert bfs({"A": ["B", "C"], "B": ["A", "D", "E"], "C": ["A", "F"], "D": ["B"], "E": ["B", "F"], "F": ["C", "E"]}, "A") == ["A", "B", "C", "D", "E", "F"]
  assert bfs({"A": ["B", "C"], "B": ["A", "D", "E"], "C": ["A", "F"], "D": ["B"], "E": ["B", "F"], "F": ["C", "E"]}, "B") == ["B", "A", "D", "E", "C", "F"]
  assert bfs({"A": ["B", "C"], "B": ["A", "D", "E"], "C": ["A", "F"], "D": ["B"], "E": ["B", "F"], "F": ["C", "E"]}, "C") == ["C", "A", "F", "B", "E", "D"]
output: def bfs(graph, start):
      visited = []
      queue = [start]
  
      while queue:
          node = queue.pop(0)
          if node not in visited:
              visited.append(node)
              queue.extend(neighbor for neighbor in graph[node] if neighbor not in visited)
  
      return visited