3 2
1 0 1
1 2
2 3
 10 10
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1
6 7
8 3
6 4
4 2
9 2
5 10
9 8
10 7
5 1
6 2

2
1
2
 0

#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;
  }
}
