structEdge { int to, next, id; } e[maxn * 2]; int c1, head[maxn]; inlinevoidadd_edge(int u, int v, int id){ e[c1].to = v; e[c1].id = id; e[c1].next = head[u]; head[u] = c1++; }
bool vis[maxn]; vector<int> ans; booldfs(int u){ int res = d[u]; vis[u] = 1; for (int i = head[u]; ~i; i = e[i].next) { int v = e[i].to, id = e[i].id; if (vis[v]) continue; if (dfs(v)) res ^= 1, ans.push_back(id); } return res; }
intmain(){ fill(head, head + maxn, -1); ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> n >> m; int sum = 0, p = 0; for (int i = 1; i <= n; ++i) { cin >> d[i]; if (~d[i]) sum += d[i]; elseif (!p) p = i; } if (sum & 1 && !p) returncout << "-1\n", 0; d[p] = sum & 1 ? 1 : 0; for (int i = p + 1; i <= n; ++i) if (d[i] == -1) d[i] = 0; for (int i = 1; i <= m; ++i) { int x, y; cin >> x >> y; add_edge(x, y, i); add_edge(y, x, i); } dfs(1); cout << ans.size() << "\n"; for (auto u : ans) cout << u << "\n"; return0; }