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 = 3e5 + 5;
int ans[maxn], idx[maxn];
vector<int> G[maxn];
int d[maxn], vis[maxn];
struct E {
  int from, to;
} edges[maxn];
void dfs(int v) {
  vis[v] = true;
  int len = G[v].size();
  for (int i = 0; i < len; i++) {
    int id = G[v][i];
    int u;
    if (v == edges[id].from) {
      u = edges[id].to;
    } else {
      u = edges[id].from;
    }
    if (!vis[u]) {
      dfs(u);
      if (d[u]) {
        ans[id] = 1;
        d[v] ^= 1;
      }
    }
  }
}
int main(void) {
  memset(ans, 0, sizeof(ans));
  memset(vis, 0, sizeof(vis));
  int n, m;
  scanf("%d %d", &n, &m);
  int cnt = 0;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &d[i]);
    if (d[i] == 1) {
      cnt++;
    }
  }
  for (int i = 1; i <= m; i++) {
    scanf("%d %d", &edges[i].from, &edges[i].to);
    G[edges[i].from].push_back(i);
    G[edges[i].to].push_back(i);
  }
  if (cnt % 2 == 1) {
    for (int i = 1; i <= n; i++) {
      if (d[i] == -1) {
        cnt++;
        d[i] = 1;
        break;
      }
    }
  }
  if (cnt % 2 != 0) {
    printf("-1\n");
    return 0;
  }
  for (int i = 1; i <= n; i++) {
    if (d[i] == -1) {
      d[i] = 0;
    }
  }
  dfs(1);
  cnt = 0;
  for (int i = 1; i <= m; i++) {
    if (ans[i]) cnt++;
  }
  printf("%d\n", cnt);
  for (int i = 1; i <= m; i++) {
    if (ans[i]) printf("%d%c", i, i == m - 1 ? '\n' : ' ');
  }
  return 0;
}
