class Solution:
def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]:
"""
tc O(V+E) sc O(V+E)
main idea: BFS topological sort
"""
g = [[] for i in range(numCourses)]
ingree = [0] * numCourses
q = collections.deque()
res = []
for snd,fst in prerequisites:
g[fst].append(snd)
ingree[snd] += 1
for i in range(numCourses):
if ingree[i] == 0:
q.append(i)
while q:
cur = q.popleft()
res.append(cur)
for child in g[cur]:
ingree[child] -= 1
if ingree[child] == 0:
q.append(child)
return res if len(res) == numCourses else []