class Solution {
public:
    bool sequenceReconstruction(vector<int>& org, vector<vector<int>>& seqs) {
        unordered_map<int, vector<int>> g;
        unordered_map<int, int> indegrees;
        for(auto& seq : seqs)
        {
            for(int i = 0; i < seq.size(); ++i)
            {
                if(!i && indegrees.find(seq[i]) == indegrees.end())
                    indegrees[seq[i]] = 0;
                if(i < seq.size() - 1)
                {
                    g[seq[i]].emplace_back(seq[i + 1]);
                    ++indegrees[seq[i + 1]];
                }
            }
        }
        
        queue<int> leaves;
        for(auto& p : indegrees)
            if(!p.second)
                leaves.push(p.first);
        
        //topological sorting
        vector<int> res;
        while(leaves.size())
        {
            if(leaves.size() != 1)
                return false;
            int node = leaves.front();
            res.emplace_back(node);
            leaves.pop();
            for(auto next : g[node])
                if(--indegrees[next] == 0)
                    leaves.push(next);
        }
        return res == org && org.size() == indegrees.size();//in case there is circle e.g. [1] ,[[1],[2,3],[3,2]]
    }
};