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;
int getint() {
  char ch = getchar();
  int f = 1, x = 0;
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return f * x;
}
const int N = 300300;
int n, m;
int d[N];
int cnt1, cntneg1;
int posneg1;
struct edge {
  int v, ord;
  edge *next;
} pool[N * 2], *head[N], *tp = pool;
vector<int> ans;
bool vis[N];
void addedge(int u, int v, int ord) {
  *tp = (edge){v, ord, head[u]}, head[u] = tp++;
  *tp = (edge){u, ord, head[v]}, head[v] = tp++;
}
void init() {
  n = getint(), m = getint();
  for (int i = 1; i <= n; i++) {
    d[i] = getint();
    if (d[i] == 1) {
      cnt1++;
    } else if (d[i] == -1) {
      cntneg1++;
      posneg1 = i;
    }
  }
  for (int i = 1; i <= m; i++) {
    int u = getint(), v = getint();
    addedge(u, v, i);
  }
}
void dfs(int x, int pre, int ord) {
  vis[x] = true;
  for (edge *i = head[x]; i; i = i->next) {
    if (i->v == pre || vis[i->v]) continue;
    dfs(i->v, x, i->ord);
  }
  if (d[x]) {
    ans.push_back(ord);
    d[x] = 0;
    d[pre] ^= 1;
  }
}
int main() {
  init();
  if (cnt1 & 1) {
    if (cntneg1 == 0) {
      puts("-1");
      return 0;
    }
    d[posneg1] = 1;
  }
  for (int i = 1; i <= n; i++) {
    if (d[i] == -1) d[i] = 0;
  }
  dfs(1, 0, 0);
  printf("%u\n", ans.size());
  sort(ans.begin(), ans.end());
  for (unsigned i = 0; i < ans.size(); i++) {
    printf("%d\n", ans[i]);
  }
  return 0;
}
