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;
vector<pair<int, int> > Next[300005];
vector<int> ans;
queue<int> now;
int d[300005];
int how[300005] = {0};
int Father[300005];
int what[300005];
bool have[300005] = {0};
int out[300005] = {0};
void F(int here) {
  have[here] = 1;
  for (auto i : Next[here]) {
    if (!have[i.first]) {
      out[here]++;
      Father[i.first] = here;
      what[i.first] = i.second;
      F(i.first);
    }
  }
  if (out[here] == 0) now.push(here);
}
int main() {
  int N, M, i, t = 0, ok = 0, con = 0, a, b;
  scanf("%d %d", &N, &M);
  for (i = 1; i <= N; i++) {
    scanf("%d", &d[i]);
    if (d[i] == -1) {
      d[i] = 0;
      ok = i;
    } else
      t += d[i];
  }
  if (t % 2 && !ok)
    printf("-1\n");
  else {
    if (t % 2) d[ok] = 1;
    for (i = 1; i <= M; i++) {
      scanf("%d %d", &a, &b);
      Next[a].push_back(make_pair(b, i));
      Next[b].push_back(make_pair(a, i));
    }
    F(1);
    while (!now.empty()) {
      t = now.front();
      now.pop();
      if (how[t] % 2 != d[t] && d[t] != -1) {
        how[t]++;
        how[Father[t]]++;
        ans.push_back(what[t]);
      }
      out[Father[t]]--;
      if (out[Father[t]] == 0) now.push(Father[t]);
    }
    printf("%d\n", (int)ans.size());
    for (auto i : ans) printf("%d\n", i);
  }
  return 0;
}
