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;
template <class T>
bool remin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
bool remax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
int nxt() {
  int first;
  scanf("%d", &first);
  return first;
}
long long gcd(long long a, long long b) {
  a = abs(a);
  b = abs(b);
  while (b) {
    a %= b;
    swap(a, b);
  }
  return a;
}
struct pt {
  long double first, second;
  pt() {}
  pt(long double first, long double second) : first(first), second(second) {}
  inline pt operator-(const pt &r) const {
    return pt(first - r.first, second - r.second);
  }
  inline pt operator+(const pt &r) const {
    return pt(first + r.first, second + r.second);
  }
  inline pt operator*(const long double &r) const {
    return pt(first * r, second * r);
  }
  inline long double sqlen() const {
    return abs(first * first + second * second);
  }
  inline long double len() const { return sqrt(sqlen()); }
  inline bool operator<(const pt &r) const {
    if (first != r.first) return first < r.first;
    return second < r.second;
  }
  inline bool operator==(const pt &r) const {
    return first == r.first && second == r.second;
  }
};
ostream &operator<<(ostream &os, const pt &p) {
  return os << "(" << p.first << "," << p.second << ")";
}
inline long double cross(const pt &l, const pt &r) {
  return l.first * r.second - l.second * r.first;
}
inline long double dot(const pt &l, const pt &r) {
  return l.first * r.first + l.second * r.second;
}
long long pwmod(long long a, long long n, long long mod) {
  long long ret = 1;
  while (n) {
    if (n & 1) ret = ret * a % mod;
    a = a * a % mod;
    n >>= 1;
  }
  return ret;
}
template <typename T>
inline T sqr(T first) {
  return first * first;
}
struct Edge {
  int a, b;
};
vector<Edge> e;
int getTo(int id, int v) {
  if (e[id].a == v) return e[id].b;
  return e[id].a;
}
vector<vector<int> > g;
vector<char> used;
vector<int> ans;
vector<int> d;
int dfs(int v) {
  used[v] = 1;
  int ww = 0;
  for (int id : g[v]) {
    int to = getTo(id, v);
    if (used[to] != 0) continue;
    int cc = dfs(to);
    if (cc) {
      ans.push_back(id);
      ++ww;
    }
  }
  if (d[v] == 1) {
    ww++;
  }
  return ww & 1;
}
void solve() {
  int n = nxt();
  int m = nxt();
  g.resize(n);
  d.resize(n);
  for (int i = 0; i < (int)(n); i++) {
    d[i] = nxt();
  }
  for (int i = 0; i < (int)(m); i++) {
    int a = nxt() - 1;
    int b = nxt() - 1;
    e.push_back(Edge{a, b});
    g[a].push_back(i);
    g[b].push_back(i);
  }
  used.assign(n, 0);
  int cnt = 0;
  for (int i = 0; i < (int)(n); i++) {
    if (d[i] == 1) {
      cnt++;
    }
  }
  if (cnt & 1) {
    for (int i = 0; i < (int)(n); i++) {
      if (d[i] == -1) {
        d[i] = 1;
        cnt++;
        break;
      }
    }
  }
  if (cnt & 1) {
    cout << "-1\n";
    return;
  }
  dfs(0);
  cout << ans.size() << "\n";
  for (int i = 0; i < (int)(ans.size()); i++) {
    cout << ans[i] + 1 << "\n";
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  double cl0 = clock();
  solve();
  cerr << "Time: " << (clock() - cl0) / CLOCKS_PER_SEC << std::endl;
  return 0;
}
