#include <bits/stdc++.h>
using namespace std;
const long long mod = 1000000007;
const int MAXN = 200000;
vector<int> lst[MAXN];
int parent[MAXN];
void make_set(int v) {
  lst[v] = vector<int>(1, v);
  parent[v] = v;
}
int find_set(int v) { return parent[v]; }
void union_sets(int a, int b) {
  a = find_set(a);
  b = find_set(b);
  if (a != b) {
    if (lst[a].size() < lst[b].size()) swap(a, b);
    while (!lst[b].empty()) {
      int v = lst[b].back();
      lst[b].pop_back();
      parent[v] = a;
      lst[a].push_back(v);
    }
  }
}
int main() {
  int n, m;
  scanf("%d %d\n", &n, &m);
  std::vector<std::vector<int> > g(n);
  for (int i = 0; i < m; i++) {
    int x, y;
    scanf("%d %d\n", &x, &y);
    x--;
    y--;
    g[x].push_back(y);
    g[y].push_back(x);
  }
  int s, t, ds, dt;
  scanf("%d %d %d %d", &s, &t, &ds, &dt);
  s--;
  t--;
  for (int i = 0; i < n; i++)
    if (i != s && i != t) make_set(i);
  std::vector<std::pair<int, int> > ans;
  for (int i = 0; i < n; i++) {
    if (i == s) continue;
    if (i == t) continue;
    for (auto j : g[i]) {
      if (j == s || j == t) continue;
      if (find_set(i) == find_set(j)) continue;
      ans.push_back(make_pair(i + 1, j + 1));
      union_sets(i, j);
    }
  }
  std::vector<int> comps;
  for (int i = 0; i < n; i++) {
    if (i == s || i == t) continue;
    if (!lst[i].empty()) comps.push_back(i);
  }
  std::vector<int> ns(n, -1);
  std::vector<int> nt(n, -1);
  for (auto v : g[s])
    if (v != t) ns[find_set(v)] = v;
  int st = 0;
  for (auto v : g[s])
    if (v == t) st = 1;
  for (auto v : g[t])
    if (v != s) nt[find_set(v)] = v;
  std::vector<int> cs, ct, c2;
  for (auto x : comps) {
    if (ns[x] >= 0 && nt[x] >= 0)
      c2.push_back(x);
    else if (ns[x] >= 0)
      cs.push_back(x);
    else
      ct.push_back(x);
  }
  for (auto x : cs) {
    ans.push_back(make_pair(s + 1, ns[x] + 1));
    ds--;
  }
  for (auto x : ct) {
    ans.push_back(make_pair(t + 1, nt[x] + 1));
    dt--;
  }
  if (ds < 0 || dt < 0) {
    cout << "No";
    return 0;
  }
  if (c2.empty()) {
    if (st == 0) {
      cout << "No";
      return 0;
    }
    if (ds <= 0 || dt <= 0) {
      cout << "No";
      return 0;
    }
    ans.push_back(make_pair(s + 1, t + 1));
  } else {
    if (ds <= 0 || dt <= 0) {
      cout << "No";
      return 0;
    }
    if (ds + dt <= c2.size()) {
      cout << "No";
      return 0;
    }
    int lasts = min(ds - 1, (int)c2.size() - 1);
    for (int i = 0; i < lasts + 1; i++) {
      ans.push_back(make_pair(s + 1, ns[c2[i]] + 1));
    }
    for (int i = lasts; i < c2.size(); i++) {
      ans.push_back(make_pair(t + 1, nt[c2[i]] + 1));
    }
  }
  printf("Yes\n");
  for (auto e : ans) {
    printf("%d %d\n", e.first, e.second);
  }
}
