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 N = 300004;
int n, m, d[N], u[N], v[N], s[N], ans;
int head[N], edgenum = 1;
struct Edge {
  int to, nxt, ans;
} edge[N << 1];
inline void add(int u, int v, int k) {
  edge[++edgenum].to = v;
  edge[edgenum].nxt = head[u];
  edge[edgenum].ans = k;
  head[u] = edgenum;
}
int f[N];
inline int find(int x) {
  if (f[x] == x) return x;
  f[x] = find(f[x]);
  return f[x];
}
inline bool merge(int k, int x, int y) {
  int fx = find(x), fy = find(y);
  if (fx == fy) return 0;
  f[fx] = fy;
  add(x, y, k);
  add(y, x, k);
  return 1;
}
inline void read(int &x) {
  x = 0;
  char c = getchar();
  int f = 1;
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = 10 * x + c - '0';
    c = getchar();
  }
  x *= f;
}
int x = -1, Fa[N], val[N];
void dfs(int u, int fa) {
  Fa[u] = fa;
  if (d[u] == 1 && x > 0) {
    d[u] = 0;
    val[x]++;
    val[u]++;
    val[find(x)]--;
    x = -1;
  }
  for (int i = head[u]; i != 0; i = edge[i].nxt)
    if (edge[i].to != fa) {
      int v = edge[i].to;
      dfs(v, u);
      if (d[u] == 1 && x > 0) {
        d[u] = 0;
        val[x]++;
        val[u]--;
        x = -1;
      }
      f[v] = u;
    }
  if (d[u] == 1 && x == -1) x = u;
}
void dfs(int u, int fa, int e) {
  for (int i = head[u]; i != 0; i = edge[i].nxt)
    if (edge[i].to != fa) {
      dfs(edge[i].to, u, edge[i].ans);
      val[u] = (val[u] + val[edge[i].to]) % 2;
    }
  if (val[u] & 1) s[++ans] = e;
}
bool judge() {
  bool exi = 0;
  int cnt = 0;
  for (int i = 1; i <= n; i++) {
    if (d[i] == 1) cnt++;
    if (d[i] == -1) exi = 1;
  }
  if ((cnt & 1) && (!exi)) return 0;
  int size = n;
  for (int i = 1; i <= n; i++) f[i] = i;
  for (int i = 1; i <= m; i++) {
    if (merge(i, u[i], v[i])) size--;
    if (size == 1) break;
  }
  if (cnt & 1)
    for (int i = 1; i <= n; i++)
      if (d[i] == -1) {
        d[i] = 1;
        break;
      }
  for (int i = 1; i <= n; i++)
    if (d[i] == 1) val[i] = 1;
  dfs(1, -1, 0);
  return 1;
}
int main() {
  read(n);
  read(m);
  for (int i = 1; i <= n; i++) read(d[i]);
  for (int i = 1; i <= m; i++) {
    read(u[i]);
    read(v[i]);
  }
  if (!judge())
    puts("-1");
  else {
    printf("%d\n", ans);
    for (int i = 1; i <= ans; i++) printf("%d\n", s[i]);
  }
  return 0;
}
