#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using ll = long long; class range {private: struct I{int x;int operator*(){return x;}bool operator!=(I& lhs){return x ostream& operator<<(ostream& os, const pair& p){ return os << "{" << p.first << ", " << p.second << "}"; } template ostream& operator<<(ostream& os, const vector& obj) { os << "{"; for (const auto& e : obj) os << e << ", "; return os << "}"; } template ostream& operator<<(ostream& os, const set& obj) { os << "set{"; for (const auto& e : obj) os << e << ", "; return os << "}"; } template ostream& operator<<(ostream& os, const map& obj) { os << "map{"; for (const auto& e : obj) os << e << ", "; return os << "}"; } #ifdef ONLINE_JUDGE #define dump(expr) ; #else #define dump(expr) { cerr << "\033[33m#L" << __LINE__ << ": " << expr << "\033[39m" << endl; } #endif ll solve() { int n, m; cin >> n >> m; vector> vg(n + 1); for (int i : range(m)) { int a, b; cin >> a >> b; vg[a].push_back(b); } if (m == 0) return 1; vector ans(n + 1); auto dfs = [&](auto self, int idx) -> int { if (ans[idx]) return ans[idx]; ans[idx] = n + 1; int res = 1; for (int to : vg[idx]) { res = max(res, 1 + self(self, to)); } res = min(res, n + 1); return ans[idx] = res; }; int res = 1; for (int i : range(n + 1)) res = max(res, dfs(dfs, i)); for (int i : range(n + 1)) dump(i << " " << dfs(dfs, i)); return (res >= n + 1) ? -1 : res; } int main() { cout << fixed << setprecision(12); cout << solve() << endl; }