#include using namespace std; #define FOR(a, b, c) for(int a = b; a < c; ++a) #define SZ(a) (int)((a).size()) using ll = long long; #define PB push_back const int N = 2e3 + 7; set graf[N]; set grafR[N]; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, m; cin >> n >> m; while(m--) { int a, b; cin >> a >> b; a--, b--; graf[a].insert(b); grafR[b].insert(a); } int res = 0; bool xd = true; while(xd) { xd = false; FOR(i, 0, n) { if(SZ(grafR[i]) >= 2) { bool usun = false; for(auto& u : grafR[i]) { if(SZ(graf[u]) == 1) usun = true; } vector temp; for(auto& u : grafR[i]) { if(usun && SZ(graf[u]) > 1) { temp.PB(u); graf[u].erase(i); xd = true; ++res; } } for(auto& u : temp) { grafR[i].erase(u); } } if(SZ(graf[i]) > 1) { bool usun = false; for(auto& u : graf[i]) { if(SZ(grafR[u]) == 1) usun = true; } vector temp; for(auto& u : graf[i]) { if(usun && SZ(grafR[u]) > 1) { temp.PB(u); grafR[u].erase(i); xd = true; ++res; } } for(auto& u : temp) { graf[i].erase(u); } } } } cout << res << "\n"; }