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 Edge {
  int to;
  int id;
  int next;
} edge[666666];
int head[666666];
int top;
void init() {
  memset(head, -1, sizeof(head));
  top = 0;
}
void add_edge(int a, int b, int id) {
  edge[top].id = id;
  edge[top].to = b;
  edge[top].next = head[a];
  head[a] = top++;
}
int n, m;
int kkke[666666];
bool hehe[666666];
set<int> st;
bool dfs(int nown) {
  hehe[nown] = true;
  int cnt = 0;
  for (int i = head[nown]; i != -1; i = edge[i].next) {
    cnt++;
    if (hehe[edge[i].to]) continue;
    if (dfs(edge[i].to)) {
      cnt--;
      st.insert(edge[i].id);
    }
  }
  if (kkke[nown] == -1 || cnt % 2 == kkke[nown]) return 0;
  return 1;
}
int main() {
  init();
  memset(hehe, false, sizeof(hehe));
  scanf("%d%d", &n, &m);
  int fff = 1;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &kkke[i]);
    if (kkke[i] == -1) fff = i;
  }
  int a, b;
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &a, &b);
    add_edge(a, b, i);
    add_edge(b, a, i);
  }
  bool tmp = dfs(fff);
  if (kkke[fff] != -1 && tmp)
    printf("-1\n");
  else {
    printf("%d\n", m - (int)st.size());
    if ((int)st.size() != m) {
      bool first = true;
      for (int i = 1; i <= m; i++) {
        if (st.find(i) == st.end()) {
          if (first)
            first = false;
          else
            putchar(' ');
          printf("%d", i);
        }
      }
      putchar('\n');
    }
  }
  return 0;
}
