func_code_string: #include <bits/stdc++.h>   using namespace std;   vector<int> adj[300003];   vector<int> adje[300003];   int d[300003];   int pickd[300003];   bool vis[300003];   int n, m;   int x;   int dfs1(int u) {     int ans = 0;     if (d[u] == -1)       x = u;     else if (d[u] == 1)       ++ans;     vis[u] = true;     for (int v : adj[u]) {       if (!vis[v]) {         ans += dfs1(v);       }     }     return ans;   }   int dfs2(int u) {     int ans = 0;     if (d[u] == 1) ++ans;     vis[u] = true;     for (int i = 0; i < ((int)(adj[u].size())); ++i) {       int v = adj[u][i];       if (!vis[v]) {         int c = dfs2(v);         if (c % 2) pickd[adje[u][i]] = 1;         ans += c;       }     }     return ans;   }   bool solve() {     memset(vis, 0, sizeof(vis));     for (int i = 1; i <= n; ++i) {       if (!vis[i]) {         x = -1;         int c = dfs1(i);         if (c % 2) {           if (x == -1)             return false;           else {             d[x] = 1;           }         }       }     }     memset(vis, 0, sizeof(vis));     memset(pickd, 0, sizeof(pickd));     for (int i = 1; i <= n; ++i) {       if (!vis[i]) {         dfs2(i);       }     }     int k = accumulate(pickd + 1, pickd + m + 1, 0);     cout << k <<   n ;     for (int i = 1; i <= m; ++i) {       if (pickd[i]) {         cout << i <<    n [(--k) == 0];       }     }     return true;   }   int main() {     ios ::sync_with_stdio(0);     while (cin >> n >> m) {       for (int i = 1; i <= n; ++i) {         cin >> d[i];       }       for (int i = 1; i <= m; ++i) {         int u, v;         cin >> u >> v;         adj[u].push_back(v);         adj[v].push_back(u);         adje[u].push_back(i);         adje[v].push_back(i);       }       if (!solve()) cout <<  -1 n ;       for (int i = 1; i <= n; ++i) {         adj[i].clear();         adje[i].clear();       }     }     return 0;   }   