#include <bits/stdc++.h>
using namespace std;
const int Edge_N = 7 + 400000;
struct Edge {
  int a, b;
} e[Edge_N];
const int UF_N = 7 + 200000;
struct UF {
  int far[UF_N];
  void init() {
    for (int i = 0; i < UF_N; i++) far[i] = i;
  }
  int getf(int d) { return far[d] == d ? d : far[d] = getf(far[d]); }
  bool same(int a, int b) { return getf(a) == getf(b); }
  void comb(int a, int b) { far[getf(a)] = b; }
} uf;
const int MAX_N = 7 + 200000;
int cana[MAX_N];
int canb[MAX_N];
int an;
pair<int, int> ans[MAX_N];
void error() {
  printf("No");
  exit(0);
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) scanf("%d%d", &e[i].a, &e[i].b);
  int a, b, lima, limb;
  scanf("%d%d%d%d", &a, &b, &lima, &limb);
  lima--;
  limb--;
  an = 0;
  uf.init();
  int dm = 0;
  bool edgab = false;
  bool canab = false;
  {
    for (int i = 1; i <= m; i++)
      if (e[i].a != a && e[i].a != b && e[i].b != a && e[i].b != b) {
        if (!uf.same(e[i].a, e[i].b)) {
          uf.comb(e[i].a, e[i].b);
          ans[++an] = make_pair(e[i].a, e[i].b);
        }
      } else if ((e[i].a == a && e[i].b == b) || (e[i].a == b && e[i].b == a)) {
        edgab = true;
      } else {
        e[++dm] = e[i];
      }
  }
  m = dm;
  memset(cana, 0, sizeof(cana));
  memset(canb, 0, sizeof(canb));
  for (int i = 1; i <= m; i++) {
    if (e[i].a == a)
      cana[uf.getf(e[i].b)] = i;
    else if (e[i].a == b)
      canb[uf.getf(e[i].b)] = i;
    else if (e[i].b == a)
      cana[uf.getf(e[i].a)] = i;
    else if (e[i].b == b)
      canb[uf.getf(e[i].a)] = i;
  }
  for (int i = 1; i <= n; i++)
    if (uf.getf(i) == i) {
      if (cana[i] && canb[i]) {
        ans[++an] = make_pair(e[cana[i]].a, e[cana[i]].b);
        ans[++an] = make_pair(e[canb[i]].a, e[canb[i]].b);
        canab = true;
        uf.far[i] = 0;
        break;
      }
    }
  if (!canab && !edgab) error();
  if (!canab) ans[++an] = make_pair(a, b);
  int both = 0;
  for (int i = 1; i <= n; i++)
    if (uf.getf(i) == i) {
      if (cana[i] && canb[i])
        both++;
      else if (cana[i]) {
        lima--;
        ans[++an] = make_pair(e[cana[i]].a, e[cana[i]].b);
      } else if (canb[i]) {
        limb--;
        ans[++an] = make_pair(e[canb[i]].a, e[canb[i]].b);
      }
    }
  if (lima < 0 || limb < 0 || lima + limb < both) error();
  for (int i = 1; i <= n; i++)
    if (uf.getf(i) == i) {
      if (cana[i] && canb[i]) {
        if (lima) {
          lima--;
          ans[++an] = make_pair(e[cana[i]].a, e[cana[i]].b);
        } else if (limb) {
          limb--;
          ans[++an] = make_pair(e[canb[i]].a, e[canb[i]].b);
        }
      }
    }
  printf("Yes\n");
  for (int i = 1; i <= an; i++) {
    printf("%d %d\n", ans[i].first, ans[i].second);
  }
}
