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;
const int MAXM = 300000;
struct Edge {
  int u, v, id;
};
int n, m, rot = 1;
vector<Edge> edges;
vector<int> G[MAXN + 10];
int d[MAXN + 10];
int res;
int q[MAXM + 10];
bool flag[MAXN + 10], vis[MAXN + 10];
void dfs(int u, const Edge& fe) {
  vis[u] = true;
  for (unsigned int i = 0; i != G[u].size(); ++i) {
    Edge& e = edges[G[u][i]];
    if (vis[e.v]) continue;
    dfs(e.v, e);
  }
  if (d[u] == -1) return;
  if (flag[u] ^ d[u]) {
    if (u == rot)
      res = -1;
    else {
      flag[fe.u] ^= 1;
      flag[u] ^= 1;
      q[++res] = fe.id;
    }
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; ++i) {
    scanf("%d", d + i);
    if (d[i] == -1) rot = i;
  }
  for (int i = 1, u, v; i <= m; ++i) {
    scanf("%d%d", &u, &v);
    edges.push_back((Edge){u, v, i});
    edges.push_back((Edge){v, u, i});
    G[u].push_back(edges.size() - 2);
    G[v].push_back(edges.size() - 1);
  }
  dfs(rot, (Edge){0, 0, 0});
  printf("%d\n", res);
  for (int i = 1; i <= res; ++i) printf("%d\n", q[i]);
  return 0;
}
