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 DSU {
  int n;
  int* p;
  DSU(int n) : n(n), p(new int[n]) {
    for (int i = 0; i < n; i++) p[i] = i;
  }
  ~DSU() { delete[] p; }
  int get(int x) {
    if (p[x] == x) return x;
    return p[x] = get(p[x]);
  }
  void unite(int a, int b) {
    a = get(a);
    b = get(b);
    p[a] = b;
  }
};
vector<vector<pair<int, int> > > v;
vector<int> d;
vector<int> res;
int solve(int cur, int pid) {
  int curdeg = 0;
  for (int i = 0; i < v[cur].size(); i++) {
    if (v[cur][i].second == pid) continue;
    curdeg ^= solve(v[cur][i].first, v[cur][i].second);
  }
  if (d[cur] != -1 && curdeg != d[cur]) {
    res.push_back(pid);
    return 1;
  }
  return 0;
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  DSU dsu(n);
  v.resize(n);
  d.resize(n);
  for (int i = 0; i < n; i++) scanf("%d", &d[i]);
  for (int i = 0; i < m; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    a--;
    b--;
    if (dsu.get(a) != dsu.get(b)) {
      v[a].push_back(make_pair(b, i + 1));
      v[b].push_back(make_pair(a, i + 1));
      dsu.unite(a, b);
    }
  }
  vector<int>::iterator it = find(d.begin(), d.end(), -1);
  int root = 0;
  if (it != d.end())
    root = it - d.begin();
  else if (accumulate(d.begin(), d.end(), 0) % 2 != 0) {
    puts("-1");
    return 0;
  }
  int resv = solve(root, -1);
  assert(resv == 0);
  printf("%d\n", (int)res.size());
  for (int i = 0; i < res.size(); i++) printf("%d\n", res[i]);
  return 0;
}
