def bfs_paths(self, start: str, goal: str) -> List[List[str]]:
        """
        Breadth-first search of all routes from start to goal.

        :param start: starting edges
        :param goal: goal edge
        :return: list of paths from start to goal.
        """
        lanes = self.graph[start].left_lanes + self.graph[start].right_lanes + [start]

        queue = [(lane, [lane]) for lane in lanes]
        while queue:
            (lane, path) = queue.pop(0)
            if lane not in self.graph:
                yield []
            if len(self.graph[lane].exit_lanes) == 0:
                continue
            for _next in set(self.graph[lane].exit_lanes):
                if _next in path:
                    # circle
                    continue
                if _next == goal:
                    yield path + [_next]
                elif _next in self.graph:
                    queue.append((_next, path + [_next]))

        Breadth-first search of all routes from start to goal.

        :param start: starting edges
        :param goal: goal edge
        :return: list of paths from start to goal.
        
metadrive/component/road_network/edge_road_network.py