#include #include #include using namespace std; const int MAX_N = 100000; const int MAX_M = 1000000; vector > > adj; vector visited; vector recStack; vector takeEdge; bool dfs(int v) { if (!visited[v]) { visited[v] = true; recStack[v] = true; for (const pair& neighbor : adj[v]) { if (!visited[neighbor.first] && dfs(neighbor.first)) { // do nothing } else if (recStack[neighbor.first]) { takeEdge[neighbor.second] = false; } } } recStack[v] = false; return false; } int main() { int n, m; cin >> n >> m; adj.resize(n); visited.assign(n, false); recStack.assign(n, false); takeEdge.assign(m, true); for (int i = 0; i < m; ++i) { int a, b; cin >> a >> b; adj[a - 1].push_back(make_pair(b - 1, i)); } for (int i = 0; i < n; ++i) { if (!visited[i]) { dfs(i); } } vector ans; for (int i = 0; i < m; ++i) { if (takeEdge[i]) { ans.push_back(i + 1); } } if (2 * ans.size() >= m) { cout << "YES" << endl; cout << ans.size() << endl; for (int e : ans) { cout << e << " "; } cout << endl; } else { cout << "NO" << endl; } return 0; }