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;
const int MAXN = 300010;
struct Edge {
  int to, No;
  Edge(int to = 0, int No = 0) : to(to), No(No) {}
};
int N, M;
int d[MAXN], OK[MAXN], ind[MAXN], minusNum, maxDepth = -1;
int depth[MAXN], pa[MAXN], paNum[MAXN];
bool fuyi, Odd, del[MAXN];
vector<Edge> G[MAXN];
vector<int> numG[MAXN];
void dfs(int x);
int main() {
  scanf("%d%d", &N, &M);
  for (int i = 1; i <= N; i++) scanf("%d", d + i);
  for (int i = 1; i <= M; i++) {
    int s, e;
    scanf("%d%d", &s, &e);
    G[s].push_back(Edge(e, i));
    G[e].push_back(Edge(s, i));
    ind[s]++;
    ind[e]++;
  }
  for (int i = 1; i <= N; i++)
    if (d[i] == -1)
      OK[i] = 1;
    else if (d[i] == 1)
      if (ind[i] % 2 == 1)
        OK[i] = 1;
      else
        OK[i] = 0;
    else if (d[i] == 0)
      if (ind[i] % 2 == 0)
        OK[i] = 1;
      else
        OK[i] = 0;
  fuyi = false;
  Odd = false;
  for (int i = 1; i <= N; i++)
    if (d[i] == -1) {
      fuyi = true;
      minusNum = i;
      break;
    } else if (OK[i] == 0)
      Odd = !Odd;
  if (!fuyi && Odd) {
    printf("-1\n");
    return 0;
  } else if (fuyi) {
    depth[minusNum] = 1;
    pa[minusNum] = -1;
    dfs(minusNum);
  } else {
    depth[1] = 1;
    pa[1] = -1;
    dfs(1);
  }
  queue<int> Q;
  for (int i = 1; i <= N; i++) {
    numG[depth[i]].push_back(i);
  }
  for (int i = maxDepth; i >= 1; i--) {
    int siz = numG[i].size();
    for (int j = 0; j < siz; j++) Q.push(numG[i][j]);
  }
  while (!Q.empty()) {
    int x = Q.front();
    Q.pop();
    if (OK[x]) {
      continue;
    }
    del[paNum[x]] = true;
    if (pa[x] != -1 && d[pa[x]] != -1) OK[pa[x]] = !OK[pa[x]];
  }
  int delNum = 0;
  for (int i = 1; i <= M; i++)
    if (del[i]) delNum++;
  printf("%d\n", M - delNum);
  for (int i = 1; i <= M; i++)
    if (!del[i]) printf("%d\n", i);
}
void dfs(int x) {
  maxDepth = max(maxDepth, depth[x]);
  int siz = G[x].size();
  for (int i = 0; i < siz; i++) {
    Edge &e = G[x][i];
    if (e.to == pa[x]) continue;
    if (depth[e.to] != 0) continue;
    pa[e.to] = x;
    depth[e.to] = depth[x] + 1;
    paNum[e.to] = e.No;
    dfs(e.to);
  }
}
