#include <bits/stdc++.h>
using namespace std;
int n, m, p[200000], s, t, ds, dt;
vector<vector<int> > g;
int find(int u) {
  if (p[u] == u) return u;
  return p[u] = find(p[u]);
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; ++i) p[i] = i;
  g.resize(n);
  for (int i = 0, a, b; i < m; ++i) {
    scanf("%d%d", &a, &b);
    --a;
    --b;
    g[a].push_back(b);
    g[b].push_back(a);
  }
  scanf("%d%d%d%d", &s, &t, &ds, &dt);
  --s;
  --t;
  vector<pair<int, int> > sol;
  for (int i = 0; i < n; ++i)
    if (i != s && i != t)
      for (int j = 0; j < g[i].size(); ++j)
        if (g[i][j] != s && g[i][j] != t) {
          int u = find(i);
          int v = find(g[i][j]);
          if (u != v) {
            p[u] = v;
            sol.push_back(make_pair(i + 1, g[i][j] + 1));
          }
        }
  vector<int> v[2];
  vector<int> both;
  bool have = false;
  for (int i = 0; i < g[s].size(); ++i)
    if (g[s][i] == t) {
      have = true;
    } else
      v[0].push_back(find(g[s][i]));
  for (int i = 0; i < g[t].size(); ++i)
    if (g[t][i] == s) {
      have = true;
    } else
      v[1].push_back(find(g[t][i]));
  for (int i = 0; i < 2; ++i) {
    sort(v[i].begin(), v[i].end());
    v[i].resize(unique(v[i].begin(), v[i].end()) - v[i].begin());
  }
  set<int> need[3];
  for (int i = 0; i < 2; ++i)
    for (int j = 0; j < v[i].size(); ++j)
      if (binary_search(v[!i].begin(), v[!i].end(), v[i][j])) {
        if (!i) need[2].insert(v[i][j]);
      } else
        need[i].insert(v[i][j]);
  if (need[0].size() > ds || need[1].size() > dt) {
    puts("No");
    return 0;
  }
  int S = need[0].size();
  int T = need[1].size();
  for (int i = 0; i < g[s].size(); ++i)
    if (need[0].find(find(g[s][i])) != need[0].end()) {
      need[0].erase(find(g[s][i]));
      sol.push_back(make_pair(s + 1, g[s][i] + 1));
    }
  for (int i = 0; i < g[t].size(); ++i)
    if (need[1].find(find(g[t][i])) != need[1].end()) {
      need[1].erase(find(g[t][i]));
      sol.push_back(make_pair(t + 1, g[t][i] + 1));
    }
  assert(need[0].empty());
  assert(need[1].empty());
  for (int it = 1; it < 2; ++it) {
    for (int i = 0; S + !it < ds && i < g[s].size(); ++i)
      if (need[2].find(find(g[s][i])) != need[2].end()) {
        need[2].erase(find(g[s][i]));
        sol.push_back(make_pair(s + 1, g[s][i] + 1));
        ++S;
      }
    for (int i = 0; T + !it < dt && i < g[t].size(); ++i)
      if (need[2].find(find(g[t][i])) != need[2].end()) {
        need[2].erase(find(g[t][i]));
        sol.push_back(make_pair(t + 1, g[t][i] + 1));
        ++T;
      }
  }
  for (int i = 0; i < n; ++i) p[i] = i;
  for (int i = 0; i < sol.size(); ++i) {
    int u = sol[i].first - 1;
    int v = sol[i].second - 1;
    u = find(u);
    v = find(v);
    if (u != v) p[u] = v;
  }
  if (sol.size() != n - 1) {
    for (int i = 0; i < n; ++i)
      for (int j = 0; j < g[i].size(); ++j) {
        int u = i;
        int v = g[i][j];
        if (u == s && S == ds) continue;
        if (u == t && T == dt) continue;
        if (v == s && S == ds) continue;
        if (v == t && T == dt) continue;
        if (find(u) != find(v)) {
          sol.push_back(make_pair(u + 1, v + 1));
          i = n;
          break;
        }
      }
  }
  if (sol.size() == n - 1) {
    puts("Yes");
    for (int i = 0; i < sol.size(); ++i)
      printf("%d %d\n", sol[i].first, sol[i].second);
  } else
    puts("No");
  return 0;
}
