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;
using ll = long long;
const int inf = 0x3f3f3f3f;
const int maxn = 3e5 + 5;
const int mod = 1e9 + 7;
struct Edge {
  int v, id, nxt;
  bool is_tree_edge;
} edge[2 * maxn];
int head[maxn], tot;
void init() {
  memset(head, -1, sizeof head);
  tot = 0;
}
void addedge(int u, int v, int id) {
  edge[tot] = {v, id, head[u], false};
  head[u] = tot++;
}
int n, m;
int d[maxn], vis[maxn];
void prim() {
  queue<int> q;
  q.push(1);
  vis[1] = 1;
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = head[u]; ~i; i = edge[i].nxt) {
      int v = edge[i].v;
      if (vis[v]) continue;
      edge[i].is_tree_edge = edge[i ^ 1].is_tree_edge = true;
      q.push(v);
      vis[v] = 1;
    }
  }
}
int sum[maxn];
int ans[maxn];
void dfs(int u, int pre) {
  sum[u] = d[u];
  for (int i = head[u]; i != -1; i = edge[i].nxt) {
    int v = edge[i].v;
    if (!edge[i].is_tree_edge || v == pre) continue;
    dfs(v, u);
    sum[u] += sum[v];
    if (sum[v] & 1) ans[edge[i].id] = 1;
  }
}
int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> m;
  int num = 0;
  for (int i = 1; i <= n; i++) {
    cin >> d[i];
    num ^= (d[i] == 1);
  }
  for (int i = 1; i <= n; i++) {
    if (d[i] == -1) {
      d[i] = (num == 1);
      num = 0;
    }
  }
  if (num == 1) {
    cout << -1 << "\n";
    return 0;
  }
  init();
  for (int i = 1; i <= m; i++) {
    int u, v;
    cin >> u >> v;
    addedge(u, v, i);
    addedge(v, u, i);
  }
  prim();
  dfs(1, 0);
  cout << accumulate(ans + 1, ans + m + 1, 0) << "\n";
  for (int i = 1; i <= m; i++)
    if (ans[i]) cout << i << "\n";
  return 0;
}
