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 lint = long long int;
using pii = std::pair<int, int>;
using std::vector;
int N, M;
int ver[300300];
int deg[300300];
bool del_graph[300300];
bool check[300300];
vector<pii> graph[300300];
vector<int> bad;
void dfs(int cur, int par, int num_of_graph) {
  if (check[cur]) return;
  check[cur] = true;
  for (int i = 0; i < graph[cur].size(); i++) {
    if (graph[cur][i].first != par) {
      dfs(graph[cur][i].first, cur, graph[cur][i].second);
    }
  }
  if (ver[cur] != -1 && ver[cur] != deg[cur] % 2) {
    del_graph[num_of_graph] = true;
    deg[cur]--;
    deg[par]--;
  }
}
int main(void) {
  bool minus_check = false;
  int minus_ind = 0;
  scanf("%d %d", &N, &M);
  for (int i = 1; i <= N; i++) {
    scanf("%d", &ver[i]);
    if (ver[i] == -1) {
      minus_check = true;
      minus_ind = i;
    }
  }
  for (int i = 1; i <= M; i++) {
    int t1, t2;
    scanf("%d %d", &t1, &t2);
    graph[t1].push_back(pii(t2, i));
    graph[t2].push_back(pii(t1, i));
    deg[t1]++;
    deg[t2]++;
  }
  for (int i = 1; i <= N; i++) {
    if (ver[i] != -1 && deg[i] % 2 != ver[i]) {
      bad.push_back(i);
    }
  }
  if (bad.size() == 0) {
    printf("%d\n", M);
    for (int i = 1; i <= M; i++) {
      printf("%d\n", i);
    }
    return 0;
  }
  if (!minus_check && bad.size() % 2 == 1) {
    printf("-1");
    return 0;
  }
  if (minus_check) {
    dfs(minus_ind, 0, -1);
  } else {
    dfs(bad[0], 0, -1);
  }
  int ans = M;
  for (int i = 1; i <= M; i++) {
    if (del_graph[i]) {
      ans--;
    }
  }
  printf("%d\n", ans);
  for (int i = 1; i <= M; i++) {
    if (!del_graph[i]) {
      printf("%d\n", i);
    }
  }
  return 0;
}
