#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000100;
const int INF = 1e9 + 10;
int n, m;
int s, t, ds, dt;
int fa[maxn];
int u, v;
struct Edge {
  int u, v;
};
Edge e[maxn], ee[maxn];
int en;
Edge ans[maxn];
int ansn;
vector<int> sv, tv, vx;
int shas[maxn], thas[maxn];
int sshas[maxn], tthas[maxn];
int Get[maxn];
bool vis[maxn];
int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
int main() {
  while (~scanf("%d%d", &n, &m)) {
    for (int i = 1; i <= n; i++) fa[i] = i, shas[i] = thas[i] = 0;
    sv.clear();
    tv.clear();
    vx.clear();
    en = 0;
    ansn = 0;
    for (int i = 1; i <= m; i++) scanf("%d%d", &ee[i].u, &ee[i].v);
    scanf("%d%d%d%d", &s, &t, &ds, &dt);
    for (int i = 1; i <= m; i++) {
      int u = ee[i].u, v = ee[i].v;
      if (u != s && u != t && v != s && v != t) e[++en] = {u, v};
      if (u == s) sv.push_back(v), shas[v] = 1;
      if (v == s) sv.push_back(u), shas[u] = 1;
      if (u == t) tv.push_back(v), thas[v] = 1;
      if (v == t) tv.push_back(u), thas[u] = 1;
    }
    for (int i = 1; i <= en; i++) {
      int u = e[i].u, v = e[i].v;
      int x = find(u), y = find(v);
      if (x != y) {
        fa[x] = y;
        ans[++ansn] = {u, v};
      }
    }
    for (int i = 1; i <= n; i++) sshas[i] = tthas[i] = 0;
    for (int i = 1; i <= n; i++) {
      if (shas[i]) sshas[find(i)] = 1;
      if (thas[i]) tthas[find(i)] = 1;
    }
    for (int i = 1; i <= n; i++) vis[i] = 0;
    for (int i = 1; i <= n; i++) {
      if (i == s || i == t) continue;
      vx.push_back(i);
    }
    sort(vx.begin(), vx.end());
    for (int i = 1; i <= n; i++) Get[i] = 0;
    int tds = 0, tdt = 0;
    bool flag = 1;
    for (int i = 0; i < vx.size(); i++) {
      int u = vx[i];
      int x = find(u);
      if (Get[x]) continue;
      if (!sshas[x] && thas[u]) {
        if (tdt >= dt) {
          flag = 0;
          break;
        }
        tdt++;
        ans[++ansn] = {t, u};
        Get[x] = 1;
      } else if (!tthas[x] && shas[u]) {
        if (tds >= ds) {
          flag = 0;
          break;
        }
        tds++;
        ans[++ansn] = {s, u};
        Get[x] = 1;
      }
    }
    for (int i = 0; i < vx.size(); i++) {
      int u = vx[i];
      int x = find(u);
      if (Get[x]) continue;
      if (tdt < dt && thas[u]) {
        tdt++;
        ans[++ansn] = {t, u};
        Get[x] = t;
      } else if (tds < ds && shas[u]) {
        tds++;
        ans[++ansn] = {s, u};
        Get[x] = s;
      }
    }
    for (int i = 0; i < vx.size(); i++) {
      int x = find(vx[i]);
      if (Get[x]) continue;
      flag = 0;
      break;
    }
    if (shas[t]) {
      if (tds < ds && tdt < dt)
        ans[++ansn] = {s, t}, tds++, tdt++;
      else {
        int tag = 0;
        for (int i = 0; i < vx.size(); i++) {
          int u = vx[i];
          int x = find(u);
          if (sshas[x] && tthas[x]) {
            if (Get[x] == s && thas[u]) {
              if (tdt < dt) {
                ans[++ansn] = {t, u}, tdt++;
                tag = 1;
                break;
              }
            } else if (Get[x] == t && shas[u]) {
              if (tds < ds) {
                ans[++ansn] = {s, u}, tds++;
                tag = 1;
                break;
              }
            }
          }
        }
        if (tag == 0) flag = 0;
      }
    } else {
      int tag = 0;
      for (int i = 0; i < vx.size(); i++) {
        int u = vx[i];
        int x = find(u);
        if (sshas[x] && tthas[x]) {
          if (Get[x] == s && thas[u]) {
            if (tdt < dt) {
              ans[++ansn] = {t, u}, tdt++;
              tag = 1;
              break;
            }
          } else if (Get[x] == t && shas[u]) {
            if (tds < ds) {
              ans[++ansn] = {s, u}, tds++;
              tag = 1;
              break;
            }
          }
        }
      }
      if (tag == 0) flag = 0;
    }
    if (flag) {
      puts("Yes");
      for (int i = 1; i <= ansn; i++) printf("%d %d\n", ans[i].u, ans[i].v);
    } else
      puts("No");
  }
  return 0;
}
