#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include bool is_dag(const std::vector>& graph) { const int n = graph.size(); std::vector visit(n, false), out(n, false); std::stack stack; for (auto i = 0; i < n; ++i) { if (visit[i]) continue; stack.push(i); while (!stack.empty()) { const auto current = stack.top(); stack.pop(); if (current >= 0) { if (visit[current]) { if (!out[current]) return false; continue; } visit[current] = true; stack.push(-1 - current); for (const auto next : graph[current]) { stack.push(next); } } else { out[-1 - current] = true; } } } return true; } int main() { int n, q; std::cin >> n >> q; std::vector> edges(q); for (auto& [a, b] : edges) { std::cin >> a >> b; --a; --b; } int min = 1; int max = q + 1; while (min < max) { auto mid = (min + max) >> 1; std::vector> graph(n); for (int e = 0; e < mid; ++e) { const auto [a, b] = edges[e]; graph[a].push_back(b); } if (is_dag(graph)) { min = mid + 1; } else { max = mid; } } if (max <= q) { std::cout << max << '\n'; } else { std::cout << "-1\n"; } }