func_code_string: #include <bits/stdc++.h>   using namespace std;   struct UnionFind {     vector<int> data;     UnionFind(int sz) { data.assign(sz, -1); }     bool unite(int x, int y) {       x = find(x), y = find(y);       if (x == y) return (false);       if (data[x] > data[y]) swap(x, y);       data[x] += data[y];       data[y] = x;       return (true);     }     int find(int k) {       if (data[k] < 0) return (k);       return (data[k] = find(data[k]));     }     int size(int k) { return (-data[find(k)]); }   };   int N, M, D[300000];   int A[300000], B[300000];   map<pair<int, int>, int> conv;   vector<int> tree[300000];   vector<int> ans;   bool dfs(int idx, int par = -1) {     bool ret = D[idx] == 1;     for (auto &to : tree[idx]) {       if (to == par) continue;       auto p = dfs(to, idx);       if (p) ans.push_back(conv[minmax(idx, to)]);       ret ^= p;     }     return (ret);   }   int main() {     scanf( %d %d , &N, &M);     for (int i = 0; i < N; i++) {       scanf( %d , &D[i]);     }     for (int i = 0; i < M; i++) {       scanf( %d %d , &A[i], &B[i]);       --A[i], --B[i];       conv[minmax(A[i], B[i])] = i;     }     UnionFind uf(N);     int root = 0;     bool found = false;     for (int i = 0; i < M; i++) {       if (uf.unite(A[i], B[i])) {         tree[A[i]].push_back(B[i]);         tree[B[i]].push_back(A[i]);       }     }     for (int i = 0; i < N; i++) {       if (D[i] == -1) {         root = i;         found = true;       }     }     if (!dfs(root) || found) {       sort(begin(ans), end(ans));       cout << ans.size() << endl;       for (auto &idx : ans) cout << idx + 1 << endl;     } else {       cout << -1 << endl;     }   }   