#include <bits/stdc++.h>
using namespace std;
ostream& operator<<(ostream& a, const vector<long long>& b) {
  for (auto k : b) cout << k << " ";
  return a;
}
istream& operator>>(istream& a, pair<long long, long long>& b) {
  cin >> b.first >> b.second;
  return a;
}
ostream& operator<<(ostream& a, const pair<long long, long long>& b) {
  cout << "{" << b.first << ", " << b.second << "}";
  return a;
}
template <typename T1, typename T2>
inline void chkmin(T1& x, const T2& y) {
  if (x > y) x = y;
}
template <typename T1, typename T2>
inline void chkmax(T1& x, const T2& y) {
  if (x < y) x = y;
}
const long long INF = 1e18;
mt19937 gen(chrono::high_resolution_clock::now().time_since_epoch().count());
const long long MAXN = 3e5 + 10;
long long n, m;
long long d[MAXN];
vector<pair<long long, long long> > g[MAXN];
long long used[MAXN], cnt[MAXN];
vector<long long> ans;
void dfs(long long v) {
  used[v] = 1;
  cnt[v] = (d[v] == 1);
  for (auto u : g[v]) {
    if (!used[u.first]) {
      dfs(u.first);
      cnt[v] += cnt[u.first];
      if (cnt[u.first] & 1) {
        ans.push_back(u.second + 1);
      }
    }
  }
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  long long ones = 0;
  long long w = -1;
  for (long long i = 0; i < n; i++) {
    cin >> d[i];
    ones += (d[i] == 1);
    if (d[i] == -1) {
      w = i;
    }
  }
  if (ones & 1) {
    if (w == -1) {
      cout << -1;
      return 0;
    }
    d[w] = 1;
  }
  long long u, v;
  for (long long i = 0; i < m; i++) {
    cin >> u >> v;
    u--, v--;
    g[u].push_back({v, i});
    g[v].push_back({u, i});
  }
  dfs(0);
  cout << ans.size() << "\n";
  cout << ans;
}
