#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 500;
struct edge {
  int x, y;
} e[N * 2];
int n, m, ss, tt, ds, dt, fa[N], es[N * 2], et[N * 2];
vector<int> ans;
bool cnn[N], vs[N * 2], vt[N * 2];
int efind(int x) { return x == fa[x] ? x : fa[x] = efind(fa[x]); }
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) scanf("%d%d", &e[i].x, &e[i].y);
  scanf("%d%d%d%d", &ss, &tt, &ds, &dt);
  for (int i = 1; i <= n; i++) fa[i] = i;
  for (int i = 1; i <= m; i++) {
    int x = efind(e[i].x), y = efind(e[i].y);
    if (x == ss || y == ss || x == tt || y == tt) continue;
    if (x ^ y) fa[y] = x, ans.push_back(i);
  }
  int spc;
  for (int i = 1; i <= m; i++) {
    int x = efind(e[i].x), y = efind(e[i].y);
    if (x == ss && y == tt || x == tt && y == ss) {
      spc = i;
      continue;
    }
    if (x == tt || y == ss) swap(x, y);
    if (x == ss) vs[y] = 1, es[y] = i;
    if (y == tt) vt[x] = 1, et[x] = i;
  }
  bool fl = 0;
  cnn[ss] = cnn[tt] = 1;
  for (int i = 1; i <= n; i++)
    if (efind(i) == i && vs[i] && vt[i]) {
      fl = 1;
      ans.push_back(es[i]), ans.push_back(et[i]);
      --ds, --dt;
      cnn[i] = 1;
      break;
    }
  if (!fl) ans.push_back(spc), --ds, --dt;
  for (int i = 1; i <= n; i++)
    if (efind(i) == i && !cnn[i]) {
      if (vs[i] && vt[i]) continue;
      if (vs[i]) ans.push_back(es[i]), --ds, cnn[i] = 1;
      if (vt[i]) ans.push_back(et[i]), --dt, cnn[i] = 1;
      if (ds < 0 || dt < 0) return puts("No"), 0;
    }
  for (int i = 1; i <= n; i++)
    if (efind(i) == i && !cnn[i]) {
      if (ds > 0)
        ans.push_back(es[i]), --ds, cnn[i] = 1;
      else
        ans.push_back(et[i]), --dt, cnn[i] = 1;
      if (ds < 0 || dt < 0) return puts("No"), 0;
    }
  puts("Yes");
  for (int i = 0; i <= (int)ans.size() - 1; i++)
    printf("%d %d\n", e[ans[i]].x, e[ans[i]].y);
  return 0;
}
