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 maxn = 300000 + 10;
int fa[maxn][20], n, m, dep[maxn], f[maxn], up[maxn], flag[maxn], d[maxn], tot,
    now, vis[maxn], en[maxn], out[maxn], ans;
struct node {
  int to, id;
};
int lca(int x, int y) {
  if (dep[x] < dep[y]) swap(x, y);
  int t = dep[x] - dep[y];
  for (int i = 0; i <= 19; i++) {
    if ((1 << i) & t) x = fa[x][i];
  }
  for (int i = 19; i >= 0; i--)
    if (fa[x][i] != fa[y][i]) {
      x = fa[x][i];
      y = fa[y][i];
    }
  if (x == y)
    return x;
  else
    return fa[x][0];
}
vector<node> g[maxn];
vector<int> h[maxn];
void dfs(int p) {
  vis[p] = 1;
  for (int i = 0; i < g[p].size(); i++) {
    node e = g[p][i];
    int v = e.to;
    if (!vis[v]) {
      fa[v][0] = p;
      up[v] = e.id;
      h[p].push_back(v);
      dfs(v);
    }
  }
}
void dp(int p) {
  for (int i = 0; i < h[p].size(); i++) {
    int v = h[p][i];
    dp(v);
    f[p] += f[v];
  }
}
void work(int a, int b) {
  int c = lca(a, b);
  f[a]++;
  f[b]++;
  f[c] -= 2;
}
int main() {
  scanf("%d%d", &n, &m);
  int cnt = 0;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &d[i]);
    if (d[i] & 1) {
      cnt++;
      en[cnt] = i;
    }
    if (d[i] == -1) now = i;
  }
  if ((cnt & 1) && now == 0) {
    puts("-1");
    return 0;
  }
  for (int i = 1; i <= m; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    g[x].push_back((node){y, i});
    g[y].push_back((node){x, i});
  }
  dfs(1);
  for (int i = 1; i <= 19; i++)
    for (int j = 1; j <= n; j++) fa[j][i] = fa[fa[j][i - 1]][i - 1];
  for (int i = 1; i + 1 <= cnt; i += 2) work(en[i], en[i + 1]);
  if (cnt & 1) work(en[cnt], now);
  dp(1);
  for (int i = 1; i <= n; i++)
    if (f[i] & 1) {
      ans++;
      out[ans] = up[i];
    }
  printf("%d\n", ans);
  for (int i = 1; i <= ans; i++) printf("%d\n", out[i]);
  return 0;
}
