#include <bits/stdc++.h>
using namespace std;
class edge {
 public:
  int e, nxt;
  edge() {}
  edge(int e1, int nxt1) { e = e1, nxt = nxt1; }
};
vector<pair<int, int> > ans;
int s, t, ds, dt, bel[200010], n, m, bcnt = 0;
int spos[200010], tpos[200010];
bool vis[200010], connst, viss[200010], vist[200010];
class graph {
 public:
  edge g[800010];
  int head[200010], tmpcnt;
  graph() {
    memset(head, 255, sizeof(head));
    tmpcnt = 0;
  }
  void addedge(int s, int e) {
    g[tmpcnt] = edge(e, head[s]), head[s] = tmpcnt++;
    g[tmpcnt] = edge(s, head[e]), head[e] = tmpcnt++;
  }
  void dfs1(int np, int b) {
    bel[np] = b;
    vis[np] = 1;
    for (int i = head[np]; i != -1; i = g[i].nxt) {
      if (!vis[g[i].e] && g[i].e != s && g[i].e != t) {
        dfs1(g[i].e, b);
        ans.push_back(make_pair(np, g[i].e));
      }
    }
  }
} G;
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1, ti, tj; i <= m; i++) {
    scanf("%d%d", &ti, &tj);
    G.addedge(ti, tj);
  }
  scanf("%d%d%d%d", &s, &t, &ds, &dt);
  for (int i = 1; i <= n; i++) {
    if (i == s || i == t) continue;
    if (!vis[i]) {
      G.dfs1(i, ++bcnt);
    }
  }
  for (int i = G.head[s]; i != -1; i = G.g[i].nxt) {
    if (G.g[i].e == t) {
    } else {
      spos[bel[G.g[i].e]] = G.g[i].e;
    }
  }
  for (int i = G.head[t]; i != -1; i = G.g[i].nxt) {
    if (G.g[i].e == s) {
    } else {
      tpos[bel[G.g[i].e]] = G.g[i].e;
    }
  }
  for (int i = 1; i <= bcnt; i++) {
    if (spos[i]) {
      if (!tpos[i]) {
        ds--;
        ans.push_back(make_pair(s, spos[i]));
      }
    } else {
      dt--;
      ans.push_back(make_pair(t, tpos[i]));
    }
  }
  if (ds < 0 || dt < 0) {
    puts("No");
    return 0;
  }
  for (int i = 1; i <= bcnt; i++) {
    if (spos[i] && tpos[i]) {
      if (ds) {
        ds--;
        ans.push_back(make_pair(s, spos[i]));
        if (!connst) {
          if (!dt) {
            puts("No");
            return 0;
          }
          ans.push_back(make_pair(t, tpos[i]));
          connst = 1;
          dt--;
        }
      } else {
        if (!dt) {
          puts("No");
          return 0;
        }
        ans.push_back(make_pair(t, tpos[i]));
        dt--;
      }
    }
  }
  if (!connst) {
    if (!ds || !dt) {
      puts("No");
      return 0;
    }
    ans.push_back(make_pair(s, t));
  }
  puts("Yes");
  for (int i = 0; i < ans.size(); i++) {
    printf("%d %d\n", ans[i].first, ans[i].second);
  }
  return 0;
}
