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;

const int MAXN = 300002;
    
vector<int> aristas[MAXN];


int tupadre[MAXN];

vector<int> tiempo[MAXN];

bool visitado[MAXN] = {false};

void dfs(int n,int t) {
    visitado[n]=true;
    tiempo[t].push_back(n);
    for (int i=0;i<aristas[n].size();i++) {
        if (!visitado[aristas[n][i]]) {
            visitado[aristas[n][i]]=true;
            tupadre[aristas[n][i]]=n;
            dfs(aristas[n][i],t+1);
        }
    }
}

int main() {
    int n,m;
    cin >> n >> m;
    int d[n];
    bool boolito = false;
    int sum=0;
    for (int i=0;i<n;i++) {
        cin >> d[i];
        if (d[i]==-1) boolito=true;
        sum+=d[i];
    }
    if (sum%2==1 && !boolito) {cout << -1; return 0;}
    vector<pair<int,int>> aristasiniciales;
    for (int i=0;i<n;i++) {
        if (d[i]==-1) {
            if (sum%2!=0) d[i]=0;
            else d[i]=1;
            sum=0;
        } 
        
    }
    int u,v;
    for (int i=0;i<m;i++) {
        cin >> u >> v;
        aristas[u-1].push_back(v-1);
        aristas[v-1].push_back(u-1);
        aristasiniciales.push_back(make_pair(u-1,v-1));
    }
    int grados[n]={};
    dfs(0,0);
    set<pair<int,int>> aristasfinales;
    for (int i=MAXN-1;i>0;i--) {
        for (int j=0;j<tiempo[i].size();j++) {
            if ((-d[tiempo[i][j]]+grados[tiempo[i][j]])%2!=0) {
                aristasfinales.insert(make_pair(tiempo[i][j],tupadre[tiempo[i][j]]));
                aristasfinales.insert(make_pair(tupadre[tiempo[i][j]],tiempo[i][j]));
                grados[tiempo[i][j]]+=1;
                grados[tupadre[tiempo[i][j]]]+=1;
            }
        }
    }
    cout << aristasfinales.size()/2 << endl;
    
    for (int i=0;i<aristasiniciales.size();i++) {
        if (aristasfinales.count(aristasiniciales[i])>0) {
            cout << i+1 << endl;
        }
    }
}