








class Solution { //both m + n
public:
vector<int> findOrder(int n, vector<vector<int>>& p) {
vector<vector<int>> nextCourses(n);
vector<int> indegree(n), ready, ans;
for (auto& pre : p){
nextCourses[pre[1]].push_back(pre[0]);
++indegree[pre[0]];
}
for (int i = 0; i < n; ++i)
if(indegree[i] == 0)
ready.push_back(i);
for (int i = 0; i < (int)ready.size(); ++i){
int course = ready[i];
ans.push_back(course);
for (int nextOne : nextCourses[course])
if (--indegree[nextOne] == 0)
ready.push_back(nextOne);
}
return (int)ans.size() == n ? ans : vector<int>{};
}
};