#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1e9 + 7;
const double PI = 3.14159265359;
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int n, m, oct = 0, mct = 0;
  cin >> n >> m;
  vector<vector<int>> graph(n + 1);
  vector<int> d(n + 1);
  int root = 0;
  for (int i = 1; i <= n; i++) {
    cin >> d[i];
    if (d[i] == 1) {
      oct++;
      if (!root) root = i;
    } else if (d[i] == -1)
      mct++;
  }
  if (!mct && oct % 2) {
    cout << -1;
    return 0;
  } else if (mct % 2) {
    bool found = false;
    for (int i = 1; i <= n; i++) {
      if (d[i] == -1) {
        if (!found)
          d[i] = 1, found = true, root = i;
        else
          d[i] = 0;
      }
    }
  } else {
    for (int i = 1; i <= n; i++) {
      if (d[i] == -1) d[i] = 0, root = i;
    }
  }
  map<pair<int, int>, int> edges;
  for (int i = 1; i <= m; i++) {
    int x, y;
    cin >> x >> y;
    edges.insert(make_pair(make_pair(x, y), i));
    edges.insert(make_pair(make_pair(y, x), i));
    graph[x].push_back(y);
    graph[y].push_back(x);
  }
  vector<int> chosen, preds(n + 1, -1), children(n + 1, 0);
  if (!root) {
    cout << 0;
    return 0;
  }
  stack<int> st;
  st.push(root);
  preds[root] = 0;
  while (!st.empty()) {
    int cur = st.top();
    for (int j : graph[cur]) {
      if (preds[j] == -1) {
        children[cur]++;
        preds[j] = cur;
        st.push(j);
      }
    }
    if (cur == st.top()) {
      if (cur != root) {
        if (d[cur] % 2) {
          if (children[cur] % 2) {
            children[preds[cur]]--;
          } else {
            chosen.push_back(edges.find(make_pair(cur, preds[cur]))->second);
          }
        } else {
          if (children[cur] % 2) {
            chosen.push_back(edges.find(make_pair(cur, preds[cur]))->second);
          } else {
            children[preds[cur]]--;
          }
        }
      }
      st.pop();
    }
  }
  cout << chosen.size() << endl;
  for (int i : chosen) {
    cout << i << endl;
  }
  return 0;
}
