#include <bits/stdc++.h>
using namespace std;
pair<bool,int> Topo(vector<vector<int>> &adj) {
int n = adj.size();
vector<int> indegree(n, 0);
for (int i = 0; i < n; i++) {
for (auto j : adj[i]) {
indegree[j]++;
}
}
queue<int> q;
for (int i = 0; i < n; i++) {
if (indegree[i] == 0) {
q.push(i);
}
}
vector<int> topo_sort;
int semesters = 0;
while (!q.empty()) {
int levelSize = q.size();
semesters++;
for (int i = 0; i < levelSize; i++) {
int node = q.front(); q.pop();
topo_sort.push_back(node);
for (int neighbor : adj[node]) {
indegree[neighbor]--;
if (indegree[neighbor] == 0) {
q.push(neighbor);
}
}
}
}
bool hasCycle = (topo_sort.size() != n);
return { !hasCycle, semesters };
}
void solve() {
int n, e;
cin >> n >> e;
vector<vector<int>> adj(n+1);
for (int i = 0; i < e; i++) {
int from, to;
cin >> from >> to;
adj[from].push_back(to);
}
auto [isValid, semesters] = Topo(adj);
if (!isValid) {
cout << -1 << "\n";
return;
}
cout << semesters << "\n";
}
int main() {
solve();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgoKcGFpcjxib29sLGludD4gVG9wbyh2ZWN0b3I8dmVjdG9yPGludD4+ICZhZGopIHsKICAgIGludCBuID0gYWRqLnNpemUoKTsKICAgIHZlY3RvcjxpbnQ+IGluZGVncmVlKG4sIDApOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgZm9yIChhdXRvIGogOiBhZGpbaV0pIHsKICAgICAgICAgICAgaW5kZWdyZWVbal0rKzsKICAgICAgICB9CiAgICB9CgogICAgcXVldWU8aW50PiBxOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBpZiAoaW5kZWdyZWVbaV0gPT0gMCkgewogICAgICAgICAgICBxLnB1c2goaSk7CiAgICAgICAgfQogICAgfQoKICAgIHZlY3RvcjxpbnQ+IHRvcG9fc29ydDsKICAgIGludCBzZW1lc3RlcnMgPSAwOwoKICAgIHdoaWxlICghcS5lbXB0eSgpKSB7CiAgICAgICAgaW50IGxldmVsU2l6ZSA9IHEuc2l6ZSgpOwogICAgICAgIHNlbWVzdGVycysrOwoKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxldmVsU2l6ZTsgaSsrKSB7CiAgICAgICAgICAgIGludCBub2RlID0gcS5mcm9udCgpOyBxLnBvcCgpOwogICAgICAgICAgICB0b3BvX3NvcnQucHVzaF9iYWNrKG5vZGUpOwoKICAgICAgICAgICAgZm9yIChpbnQgbmVpZ2hib3IgOiBhZGpbbm9kZV0pIHsKICAgICAgICAgICAgICAgIGluZGVncmVlW25laWdoYm9yXS0tOwogICAgICAgICAgICAgICAgaWYgKGluZGVncmVlW25laWdoYm9yXSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcS5wdXNoKG5laWdoYm9yKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBib29sIGhhc0N5Y2xlID0gKHRvcG9fc29ydC5zaXplKCkgIT0gbik7CiAgICByZXR1cm4geyAhaGFzQ3ljbGUsIHNlbWVzdGVycyB9Owp9Cgp2b2lkIHNvbHZlKCkgewogICAgaW50IG4sIGU7CiAgICBjaW4gPj4gbiA+PiBlOwogICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBhZGoobisxKTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGU7IGkrKykgewogICAgICAgIGludCBmcm9tLCB0bzsKICAgICAgICBjaW4gPj4gZnJvbSA+PiB0bzsKICAgICAgICBhZGpbZnJvbV0ucHVzaF9iYWNrKHRvKTsKICAgIH0KCiAgICBhdXRvIFtpc1ZhbGlkLCBzZW1lc3RlcnNdID0gVG9wbyhhZGopOwoKICAgIGlmICghaXNWYWxpZCkgewogICAgICAgIGNvdXQgPDwgLTEgPDwgIlxuIjsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgY291dCA8PCBzZW1lc3RlcnMgPDwgIlxuIjsKfQoKaW50IG1haW4oKSB7CiAgICBzb2x2ZSgpOwogICAgcmV0dXJuIDA7Cn0K