#include using namespace std; using ll = long long; using vll = vector; using vvll = vector; using ld = long double; using vld = vector; using vvld = vector; using vs = vector; using vvs = vector; using vb = vector; using vvb = vector; using pll = pair; using vpll = vector; using vvpll = vector; #define norm_mod(x, m) (((x % m) + m) % m) #define add_mod(a, b, m) norm_mod((a % m) + (b % m), m) #define sub_mod(a, b, m) norm_mod((a % m) - (b % m), m) #define mult_mod(a, b, m) norm_mod((a % m) * (b % m), m) #define fixed(n) fixed << setprecision(n) #define rall(x) (x).rbegin(), (x).rend() #define all(x) (x).begin(), (x).end() #define pb push_back #define mp make_pair #define fi first #define se second void setIO(string name = "") { cin.tie(0)->sync_with_stdio(0); if (name.size() && ifstream(name + ".in").good()) { freopen((name + ".in").c_str(), "r", stdin); freopen((name + ".out").c_str(), "w", stdout); } } bool kahn(const vvll &g, vll &order) { order = vll(); ll n = g.size(); vll indegree(n, 0); for (ll v = 0; v < n; v++) for (ll u : g[v]) indegree[u]++; for (ll v = 0; v < n; v++) if (indegree[v] == 0) order.push_back(v); for (ll i = 0; i < order.size(); i++) for (ll u : g[order[i]]) if (--indegree[u] == 0) order.push_back(u); return order.size() == n; } void solve() { ll n, k; cin >> n >> k; vvll g(n); for (ll i = 0; i < k; i++) { ll r, c; cin >> r >> c; g[--r].push_back(--c); } vll order; bool dag = kahn(g, order); if (!dag) { cout << "-1\n"; return; } vll dp(n, 0); ll max_path = 0; for (ll u : order) { for (ll v : g[u]) dp[v] = max(dp[v], dp[u] + 1); max_path = max(max_path, dp[u]); } cout << max_path + 1 << '\n'; } int main() { setIO(); ll cases = 1; // cin >> cases; for (ll tc = 1; tc <= cases; tc++) { // cout << "Case #" << tc << ": "; solve(); } }