#include #include using namespace atcoder; using namespace std; using ll=long long; using ul=unsigned long long; using ld=long double; using mint = modint1000000007; int dx[8] = {-1, 1, 0, 0, -1, -1, 1, 1}; int dy[8] = {0, 0, -1, 1, -1, 1, -1, 1}; using Graph=vector>; vectorTopologicalSort(const vector>& graph){ vector indegrees(graph.size()); for(const auto& v:graph){ for(const auto& to:v)indegrees[to]++; } //辞書順最大 → greaterを消す priority_queue,greater>pq; for(int i=0;i<(int)graph.size();i++){ if(indegrees[i]==0)pq.push(i); } vector result; while (!pq.empty()){ const int from=pq.top();pq.pop(); result.push_back(from); for (const auto& to:graph[from]){ if(--indegrees[to]==0)pq.push(to); } } if(result.size()!=graph.size())return{}; return result; } int main(){ int N,Q; cin>>N>>Q; vectorA(Q),B(Q); for(int i=0;i>A[i]>>B[i],A[i]--,B[i]--; int l=0,r=Q+1; while(r-l>1){ vector>G(N); int m=(l+r)/2; for(int i=0;iT=TopologicalSort(G); if(T.size()==0)r=m; else l=m; } if(l==Q)cout<<-1<