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, next, w;
  edge(int _to = 0, int _next = 0, int _w = 0) : to(_to), next(_next), w(_w) {}
} e[300010 << 1];
int n, m;
int g[300010], nume = 0;
int d[300010];
int f[300010][2];
vector<int> ans;
namespace LCT {
int f[300010];
void init() {
  for (int i = 1; i <= n; i++) f[i] = i;
}
int getf(int x) {
  if (f[x] == x) return x;
  return f[x] = getf(f[x]);
}
int merge(int x, int y) { f[f[x]] = f[y]; }
}  // namespace LCT
void addEdge(int u, int v, int w) {
  e[nume] = edge(v, g[u], w);
  g[u] = nume++;
}
void dfs(int x, int p) {
  for (int i = g[x]; ~i; i = e[i].next)
    if (e[i].to ^ p) dfs(e[i].to, x);
  int numch = 0;
  static int ch[300010][2];
  int c0 = 0, c1 = 0;
  for (int i = g[x]; ~i; i = e[i].next)
    if (e[i].to ^ p) {
      ++numch;
      ch[numch][0] = f[e[i].to][0];
      ch[numch][1] = f[e[i].to][1];
      if (!ch[numch][0] && !ch[numch][1]) {
        f[x][0] = f[x][1] = 0;
        return;
      }
      if (ch[numch][0] && ch[numch][1]) {
        f[x][0] = f[x][1] = 1;
        return;
      }
      if (ch[numch][0]) c0++;
      if (ch[numch][1]) c1++;
    }
  if (d[x] == -1) {
    f[x][0] = f[x][1] = 1;
    return;
  }
  if (d[x] == 0) {
    if (c1 & 1) {
      f[x][1] = 1;
      f[x][0] = 0;
    } else {
      f[x][1] = 0;
      f[x][0] = 1;
    }
  } else {
    if (c1 & 1) {
      f[x][1] = 0;
      f[x][0] = 1;
    } else {
      f[x][1] = 1;
      f[x][0] = 0;
    }
  }
}
void dfs2(int x, int p, int fx) {
  if (f[x][0] != f[x][1]) {
    for (int i = g[x]; ~i; i = e[i].next)
      if (e[i].to ^ p)
        if (f[e[i].to][0]) {
          dfs2(e[i].to, x, 0);
        } else {
          ans.push_back(e[i].w);
          dfs2(e[i].to, x, 1);
        }
  } else {
    int temp = -1, c1 = 0;
    for (int i = g[x]; ~i; i = e[i].next)
      if (e[i].to ^ p) {
        if (f[e[i].to][0] == f[e[i].to][1] && temp == -1) {
          temp = i;
        } else {
          if (f[e[i].to][0])
            dfs2(e[i].to, x, 0);
          else {
            dfs2(e[i].to, x, 1);
            ans.push_back(e[i].w);
            c1++;
          }
        }
      }
    if (temp == -1) return;
    if ((c1 & 1) == fx)
      dfs2(e[temp].to, x, 0);
    else {
      dfs2(e[temp].to, x, 1);
      ans.push_back(e[temp].w);
    }
  }
}
int main() {
  memset(g, -1, sizeof g);
  scanf("%d%d", &n, &m);
  LCT::init();
  for (int i = 1; i <= n; i++) scanf("%d", d + i);
  for (int i = 1; i <= m; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    if (LCT::getf(u) ^ LCT::getf(v)) {
      addEdge(u, v, i);
      addEdge(v, u, i);
      LCT::merge(u, v);
    }
  }
  dfs(1, 0);
  if (!f[1][0]) {
    puts("-1");
    return 0;
  }
  dfs2(1, 0, 0);
  int numans = ans.size();
  printf("%d\n", numans);
  for (int i = 0; i < numans; i++) printf("%d\n", ans[i]);
  return 0;
}
