#include <bits/stdc++.h>
using namespace std;
vector<int> odp;
int jed = -1;
void dfs(vector<vector<int> >& T, vector<int>& par, int akt, int oj) {
  odp.push_back(akt);
  par[akt] ^= 1;
  for (int i = 0; i < T[akt].size(); ++i) {
    if (T[akt][i] != oj) {
      dfs(T, par, T[akt][i], akt);
      odp.push_back(akt);
      par[akt] ^= 1;
    }
  }
  if (par[akt] == 1 && akt != jed) {
    odp.push_back(oj);
    par[oj] ^= 1;
    odp.push_back(akt);
    par[akt] ^= 1;
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  int n, m;
  cin >> n >> m;
  vector<vector<int> > G(n);
  for (int i = 0; i < m; ++i) {
    int a, b;
    cin >> a >> b;
    --a;
    --b;
    G[a].push_back(b);
    G[b].push_back(a);
  }
  vector<int> par(n);
  for (int i = 0; i < n; ++i) {
    cin >> par[i];
    if (par[i] == 1) jed = i;
  }
  if (jed == -1) {
    cout << "0";
    return 0;
  }
  vector<vector<int> > T(n);
  queue<int> Q;
  vector<bool> odw(n, false);
  Q.push(jed);
  odw[jed] = true;
  while (!Q.empty()) {
    int akt = Q.front();
    Q.pop();
    for (int i = 0; i < G[akt].size(); ++i) {
      if (!odw[G[akt][i]]) {
        odw[G[akt][i]] = true;
        Q.push(G[akt][i]);
        T[akt].push_back(G[akt][i]);
        T[G[akt][i]].push_back(akt);
      }
    }
  }
  for (int i = 0; i < n; ++i) {
    if (par[i] == 1 && !odw[i]) {
      cout << "-1";
      return 0;
    }
  }
  dfs(T, par, jed, -1);
  if (par[jed] == 1) odp.pop_back();
  cout << odp.size() << endl;
  for (int i = 0; i < odp.size(); ++i) cout << odp[i] + 1 << " ";
  return 0;
}
