#include <bits/stdc++.h>
using namespace std;
const int N = 200000 + 5, M = 400000 + 5;
int n, m, u[M], v[M], s, t, ds, dt, cnt = 0, id[N], from[N][2], fa[N];
bool con[N][2], link[N][2], need_direct = true;
vector<pair<int, int> > ans;
int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
void init() {
  memset(con, false, sizeof(con));
  memset(link, false, sizeof(link));
  memset(id, 0, sizeof(id));
}
bool is_st(int x) { return (x == s || x == t); }
int main() {
  scanf("%d", &n);
  scanf("%d", &m);
  for (int i = 1; i <= m; i++) scanf("%d", &u[i]), scanf("%d", &v[i]);
  scanf("%d", &s);
  scanf("%d", &t);
  scanf("%d", &ds);
  scanf("%d", &dt);
  init();
  for (int i = 1; i <= m; i++) {
    if (u[i] == s) con[v[i]][0] = true;
    if (u[i] == t) con[v[i]][1] = true;
    if (v[i] == s) con[u[i]][0] = true;
    if (v[i] == t) con[u[i]][1] = true;
  }
  for (int i = 1; i <= n; i++) fa[i] = i;
  for (int i = 1; i <= m; i++) {
    int x = u[i], y = v[i];
    if (is_st(x) || is_st(y)) continue;
    int f1 = find(x), f2 = find(y);
    if (f1 != f2) {
      fa[f1] = f2;
      ans.push_back(make_pair(x, y));
    }
  }
  for (int i = 1; i <= n; i++) {
    if (is_st(i)) continue;
    int f = find(i);
    if (!id[f]) {
      cnt++;
      id[f] = cnt;
    }
    int j = id[f];
    if (con[i][0]) {
      link[j][0] = true;
      from[j][0] = i;
    }
    if (con[i][1]) {
      link[j][1] = true;
      from[j][1] = i;
    }
  }
  for (int i = 1; i <= cnt; i++)
    if (link[i][0] ^ link[i][1]) {
      if (link[i][0]) {
        ds--;
        ans.push_back(make_pair(from[i][0], s));
      }
      if (link[i][1]) {
        dt--;
        ans.push_back(make_pair(from[i][1], t));
      }
    } else {
      need_direct = false;
      if ((link[i][0] | link[i][1]) == 0) {
        printf("No\n");
        return 0;
      }
    }
  bool st_have_linked = false;
  if (need_direct) {
    for (int i = 1; i <= m; i++)
      if (is_st(u[i]) && is_st(v[i])) {
        dt--;
        ds--;
        ans.push_back(make_pair(t, s));
        need_direct = false;
        break;
      }
    if (need_direct) {
      printf("No\n");
      return 0;
    }
  } else
    for (int i = 1; i <= cnt; i++)
      if (link[i][0] & link[i][1]) {
        if (!st_have_linked) {
          ds--;
          ans.push_back(make_pair(from[i][0], s));
          dt--;
          ans.push_back(make_pair(from[i][1], t));
          st_have_linked = true;
          continue;
        }
        if (ds >= dt) {
          ds--;
          ans.push_back(make_pair(from[i][0], s));
        } else {
          dt--;
          ans.push_back(make_pair(from[i][1], t));
        }
        if (ds < 0 || dt < 0) {
          printf("No\n");
          return 0;
        }
      }
  if (ds < 0 || dt < 0) {
    printf("No\n");
    return 0;
  }
  printf("Yes\n");
  for (int i = 0; i < (int)ans.size(); i++)
    printf("%d %d\n", ans[i].first, ans[i].second);
}
