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;
int n, m;
vector<vector<int> > v;
vector<vector<int> > tree;
vector<int> d;
bool dfs_break = 0;
vector<int> ans;
vector<vector<int> > number;
vector<vector<int> > number2;
vector<bool> used;
bool dfs(int cur) {
  bool flag = d[cur] == 1;
  for (int i = 0; i < v[cur].size(); i++) {
    int tmp = v[cur][i];
    if (used[tmp]) continue;
    used[tmp] = 1;
    if (dfs(tmp)) {
      tree[cur].push_back(tmp);
      number2[cur].push_back(number[cur][i]);
      flag = 1;
    }
  }
  return flag;
}
bool dfs2(int cur) {
  bool flag = d[cur] == 1;
  for (int i = 0; i < tree[cur].size(); i++) {
    int tmp = tree[cur][i];
    if (dfs2(tmp)) {
      ans.push_back(number2[cur][i]);
      flag = !flag;
    }
  }
  return flag;
}
int main() {
  cin >> n >> m;
  d.resize(n);
  bool one = 0;
  bool minus_one = 0;
  for (int i = 0; i < n; i++) {
    scanf("%d", &d[i]);
    if (d[i] == 1) one = !one;
    if (d[i] == -1) minus_one = 1;
  }
  if (minus_one != 1 && one) {
    cout << -1 << endl;
    return 0;
  }
  if (minus_one == 1 && one) {
    for (int i = 0; i < d.size(); i++)
      if (d[i] == -1) {
        d[i] = 1;
        break;
      }
  }
  number.resize(n);
  number2.resize(n);
  v.resize(n);
  tree.resize(n);
  for (int i = 0; i < m; i++) {
    int s, t;
    scanf("%d %d", &s, &t);
    s -= 1;
    t -= 1;
    v[s].push_back(t);
    v[t].push_back(s);
    number[s].push_back(i);
    number[t].push_back(i);
  }
  used.resize(n, 0);
  used[0] = 1;
  dfs(0);
  dfs2(0);
  cout << ans.size() << endl;
  for (int i = 0; i < ans.size(); i++) cout << ans[i] + 1 << endl;
}
