#include <bits/stdc++.h>
using namespace std;
const int Maxn = 5e5 + 7;
struct node {
  int u, v;
} e[Maxn];
vector<node> tmp, ans, mp[Maxn];
int fa[Maxn], check[Maxn];
int findFa(int x) { return fa[x] == x ? x : fa[x] = findFa(fa[x]); }
int main() {
  int n, m, s, t, ds, dt, degree_s = 0, degree_t = 0;
  bool flag1 = 0, flag2 = 0;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; ++i) fa[i] = i;
  for (int i = 0; i < m; ++i) scanf("%d%d", &e[i].u, &e[i].v);
  scanf("%d%d%d%d", &s, &t, &ds, &dt);
  for (int i = 0; i < m; ++i) {
    if (e[i].u == s || e[i].v == s || e[i].u == t || e[i].v == t)
      tmp.push_back(e[i]);
    else {
      int x = findFa(e[i].u), y = findFa(e[i].v);
      if (x != y) fa[x] = y, ans.push_back(e[i]);
    }
  }
  for (int i = 0, isup = tmp.size(); i < isup; ++i) {
    if (tmp[i].v == s || tmp[i].v == s || tmp[i].v == t || tmp[i].v == t)
      swap(tmp[i].u, tmp[i].v);
    int x = findFa(tmp[i].u), y = findFa(tmp[i].v);
    if (x + y == s + t)
      flag1 = 1;
    else if (x == s)
      check[y] |= 1, mp[y].push_back(tmp[i]);
    else if (y == s)
      check[x] |= 1, mp[x].push_back(tmp[i]);
    else if (x == t)
      check[y] |= 2, mp[y].push_back(tmp[i]);
    else if (y == t)
      check[x] |= 2, mp[x].push_back(tmp[i]);
  }
  for (int i = 1; i <= n; ++i) {
    if (check[i] == 1) {
      ++degree_s;
      ans.push_back(mp[i][0]);
    } else if (check[i] == 2) {
      ++degree_t;
      ans.push_back(mp[i][0]);
    }
  }
  for (int i = 1; i <= n; ++i)
    if (check[i] == 3) {
      if (!flag2) {
        int cnt = 0;
        for (int j = 0; j < mp[i].size(); j++) {
          if (mp[i][j].u == s && (cnt & 1) == 0)
            ans.push_back(mp[i][j]), cnt |= 1;
          else if (mp[i][j].u == t && (cnt & 2) == 0)
            ans.push_back(mp[i][j]), cnt |= 2;
        }
        ++degree_s, ++degree_t;
        flag2 = 1;
      } else {
        int st = ds - degree_s < dt - degree_t ? t : s;
        for (int j = 0, jsup = mp[i].size(); j < jsup; ++j)
          if (mp[i][j].u == st) {
            ans.push_back(mp[i][j]);
            break;
          }
        st == t ? ++degree_t : ++degree_s;
      }
    }
  if (!flag2 && flag1) {
    ++degree_s, ++degree_t;
    ans.push_back((node){s, t});
  }
  if (degree_s <= ds && degree_t <= dt && ans.size() == n - 1) {
    printf("Yes\n");
    for (int i = 0, isup = ans.size(); i < isup; ++i)
      printf("%d %d\n", ans[i].u, ans[i].v);
  } else
    printf("No\n");
  return 0;
}
