#include <bits/stdc++.h>
using namespace std;
int N, M;
int D[300000];
vector<pair<int, int> > G[300000];
bool used[300000];
int T[300000];
int A[300000];
struct UF {
  int U[300000], R[300000];
  UF(int n) {
    for (int i = 0; i < n; i++) U[i] = i, R[i] = 1;
  }
  int find(int x) {
    if (U[x] == x) return x;
    return U[x] = find(U[x]);
  }
  void unite(int x, int y) {
    x = find(x), y = find(y);
    if (x == y) return;
    if (R[x] < R[y]) swap(x, y);
    U[y] = x;
    R[x] += R[y];
    R[y] = 0;
  }
  bool same(int x, int y) { return find(x) == find(y); }
};
int dfs(int x, int p, int id) {
  for (pair<int, int> pp : G[x]) {
    int t = pp.first;
    if (t == p) continue;
    T[x] ^= dfs(t, x, pp.second);
  }
  if (T[x]) {
    assert(id != -1);
    A[id] ^= 1;
  }
  return T[x];
}
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> N >> M;
  UF uf(N);
  bool contains_m1 = false;
  for (int i = 0; i < (N); i++) {
    cin >> D[i];
    if (D[i] == -1) contains_m1 = true;
  }
  for (int i = 0; i < (M); i++) {
    int u, v;
    cin >> u >> v;
    u--, v--;
    if (uf.same(u, v)) continue;
    G[u].push_back(pair<int, int>(v, i));
    G[v].push_back(pair<int, int>(u, i));
    uf.unite(u, v);
  }
  int s = 0;
  for (int i = 0; i < (N); i++)
    if (D[i] != -1) s ^= D[i];
  if (s == 1) {
    if (!contains_m1) {
      cout << -1 << "\n";
      return 0;
    }
    for (int i = 0; i < (N); i++) {
      if (D[i] == -1) {
        D[i] = 1;
        break;
      }
    }
  }
  for (int i = 0; i < (N); i++) {
    if (D[i] == -1) D[i] = 0;
  }
  vector<int> vs;
  for (int i = 0; i < (N); i++) {
    if (D[i]) vs.push_back(i);
  }
  assert((int)vs.size() % 2 == 0);
  for (int i = 0; i < (((int)vs.size()) / 2); i++) {
    int a = vs[i * 2], b = vs[i * 2 + 1];
    T[a] ^= 1;
    T[b] ^= 1;
  }
  dfs(0, -1, -1);
  int num = 0;
  for (int i = 0; i < (M); i++) num += A[i];
  cout << num << "\n";
  for (int i = 0; i < (M); i++) {
    if (A[i]) cout << i + 1 << " ";
  }
  cout << "\n";
  return 0;
}
