#include <bits/stdc++.h>
using namespace std;
const int N = 1000005;
const int inf = 1e9 + 7;
inline void read(int &x) {
  x = 0;
  char ch = getchar();
  while (ch < '0') ch = getchar();
  while (ch >= '0') {
    x = x * 10 + ch - 48;
    ch = getchar();
  }
}
struct edge {
  int x, y;
} g[N];
int nxt[N], to[N], head[N], e;
int s, t, ds, dt, col[N];
int msk[N], fa[N];
int mp1[N], mp2[N], tp[N], solo;
vector<pair<int, int> > ans, gr[N];
inline void init() {
  memset(head, -1, sizeof(head));
  ans.clear();
  e = 0;
}
void dfs(int x, int c, int pv) {
  if (x == s) msk[c] |= 1, mp1[c] = pv;
  if (x == t) msk[c] |= 2, mp2[c] = pv;
  if (x == s || x == t || col[x]) return;
  col[x] = c;
  for (int i = head[x]; i + 1; i = nxt[i]) dfs(to[i], c, x);
}
inline void add_edge(int x, int y) {
  to[e] = y;
  nxt[e] = head[x];
  head[x] = e++;
}
inline int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); }
inline void unite(int x, int y) { fa[x] = y; }
inline void get_span(int x) {
  for (int i = 0; i < gr[x].size(); i++) {
    int tx = find(gr[x][i].first), ty = find(gr[x][i].second);
    if (tx == ty) continue;
    unite(tx, ty);
    ans.push_back(make_pair(gr[x][i].first, gr[x][i].second));
  }
}
int main() {
  init();
  int n, m;
  read(n);
  read(m);
  for (int i = (1); i <= (m); i++) {
    read(g[i].x);
    read(g[i].y);
    add_edge(g[i].x, g[i].y);
    add_edge(g[i].y, g[i].x);
  }
  read(s);
  read(t);
  read(ds);
  read(dt);
  for (int i = (1); i <= (n); i++) fa[i] = i;
  for (int i = (1); i <= (m); i++)
    if ((g[i].x == s && g[i].y == t) || (g[i].x == t && g[i].y == s)) solo = 1;
  int kk = 0;
  for (int i = (1); i <= (n); i++) {
    if (i == s || i == t || col[i]) continue;
    dfs(i, ++kk, 0);
  }
  for (int i = (1); i <= (m); i++) {
    if (g[i].x == s || g[i].x == t || g[i].y == s || g[i].y == t) continue;
    gr[col[g[i].x]].push_back(make_pair(g[i].x, g[i].y));
  }
  for (int i = (1); i <= (kk); i++) get_span(i);
  for (int i = (1); i <= (kk); i++)
    if (msk[i] < 3) {
      if (msk[i] == 1)
        ans.push_back(make_pair(s, mp1[i])), --ds;
      else
        ans.push_back(make_pair(t, mp2[i])), --dt;
    }
  if (ds < 0 || dt < 0) return puts("No"), 0;
  for (int i = (1); i <= (kk); i++)
    if (msk[i] == 3) {
      if (ds)
        ans.push_back(make_pair(s, mp1[i])), --ds, tp[i] = 2;
      else
        ans.push_back(make_pair(t, mp2[i])), --dt, tp[i] = 1;
    }
  if (ds < 0 || dt < 0 || ds + dt <= 0) return puts("No"), 0;
  int zyw = 0;
  if (ds)
    for (int i = (1); i <= (kk); i++)
      if (tp[i] == 1) {
        ans.push_back(make_pair(s, mp1[i]));
        --ds;
        zyw = 1;
        break;
      }
  if (!zyw && dt)
    for (int i = (1); i <= (kk); i++)
      if (tp[i] == 2) {
        ans.push_back(make_pair(t, mp2[i]));
        --dt;
        zyw = 1;
        break;
      }
  if (!zyw && solo && ds && dt) {
    ans.push_back(make_pair(s, t));
    zyw = 1;
  }
  if (!zyw) return puts("No"), 0;
  puts("Yes");
  for (int i = 0; i < ans.size(); ++i)
    printf("%d %d\n", ans[i].first, ans[i].second);
  return 0;
}
