#include <bits/stdc++.h>
using namespace std;
int n, m;
int d[1000000];
vector<int> G1[1000000];
vector<int> G2[1000000];
int vis[1000000];
map<pair<int, int>, int> ord;
void bui(int x, int p) {
  vis[x] = 1;
  if (p != -1) G2[p].push_back(x);
  for (auto a : G1[x]) {
    if (vis[a] == 0) {
      bui(a, x);
    }
  }
}
vector<pair<int, int>> path;
int dfs(int x, int p) {
  int res = 0;
  for (auto a : G2[x]) {
    if (a != p) {
      if (dfs(a, x) == 1) {
        path.push_back({x, a});
        res++;
      }
    }
  }
  if (d[x] == -1 || res % 2 == d[x]) {
    return 0;
  } else {
    return 1;
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> m;
  int root = -1;
  for (int i = 0; i < n; i++) {
    cin >> d[i + 1];
    if (d[i + 1] == -1) root = i + 1;
  }
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    G1[u].push_back(v);
    G1[v].push_back(u);
    ord[{u, v}] = i;
    ord[{v, u}] = i;
  }
  if (root == -1) {
    bui(root = 1, -1);
  } else {
    bui(root, -1);
  }
  if (dfs(root, -1) == 1) {
    cout << -1 << endl;
  } else {
    cout << path.size() << endl;
    vector<int> ans;
    for (auto a : path) {
      ans.push_back(ord[a]);
    }
    sort(ans.begin(), ans.end());
    for (auto a : ans) {
      cout << a + 1 << endl;
    }
  }
  return 0;
}
