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;
int n, m;
vector<int> graph[300005];
int d[300005];
int deg[300005];
int vis[300005];
int del[300005];
int ok[300005];
struct node {
  int u, v;
} edges[300004];
int dfs(int u) {
  ok[u] = 1;
  int ct = 0;
  for (int i = 0; i < graph[u].size(); i++) {
    int j = graph[u][i], v;
    if (edges[j].u == u)
      v = edges[j].v;
    else
      v = edges[j].u;
    if (ok[v] == false) {
      int temp = dfs(v);
      if (temp == true) {
        ct++;
        del[j] = 1;
      }
    }
  }
  if (ct % 2 != d[u] % 2) return 1;
  return 0;
}
int main() {
  scanf("%d %d", &n, &m);
  int odd = 0, even = 0, minusone = 0;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &d[i]);
    if (d[i] == -1) {
      minusone = i;
    }
    if (d[i] == 1) {
      odd++;
    }
    if (d[i] == 0) {
      even++;
    }
  }
  for (int i = 1; i <= m; i++) {
    int u, v;
    scanf("%d %d", &u, &v);
    edges[i].u = u;
    edges[i].v = v;
    graph[u].push_back(i);
    graph[v].push_back(i);
    deg[u]++;
    deg[v]++;
  }
  if (minusone == 0 && (odd % 2) == 1) {
    printf("-1\n");
    return 0;
  }
  if (minusone == 0)
    dfs(1);
  else
    dfs(minusone);
  int ans = 0;
  for (int j = 1; j <= m; j++) {
    if (del[j]) ans++;
  }
  printf("%d\n", ans);
  for (int j = 1; j <= m; j++) {
    if (del[j]) {
      printf("%d ", j);
    }
  }
  return 0;
}
