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 str {
  int v, nex, mark;
} edge[301000 << 1];
int f[301000], fa[301000], fst[301000], mark[301000], pas[301000], ans[301000];
int n, m, top, sing, san;
int e;
int find(int a) { return (fa[a] == a ? a : (fa[a] = find(fa[a]))); }
void make_edge(int a, int b, int mark) {
  edge[++e].nex = fst[a];
  fst[a] = e;
  edge[e].v = b;
  edge[e].mark = mark;
  edge[++e].nex = fst[b];
  fst[b] = e;
  edge[e].v = a;
  edge[e].mark = mark;
}
void dfs(int u) {
  if (mark[u] != 1) mark[u] = 0;
  for (int i = fst[u]; i; i = edge[i].nex) {
    int v = edge[i].v;
    if (f[u] == v) continue;
    f[v] = u;
    pas[v] = edge[i].mark;
    dfs(v);
  }
  if (mark[u]) {
    ans[++top] = pas[u];
    mark[f[u]] ^= 1;
  }
  return;
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; i++) fa[i] = i;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &mark[i]);
    if (mark[i] == 1) sing ^= 1;
    if (mark[i] == -1) san = i;
  }
  for (int i = 1; i <= m; i++) {
    int a, b;
    scanf("%d %d", &a, &b);
    if (find(a) == find(b)) continue;
    fa[fa[a]] = fa[b];
    make_edge(a, b, i);
  }
  if (sing && !san) {
    printf("-1");
    return 0;
  }
  if (sing) mark[san] = 1;
  dfs(1);
  printf("%d\n", top);
  for (int i = 1; i <= top; i++) printf("%d\n", ans[i]);
  return 0;
}
