#include <bits/stdc++.h>
using namespace std;
using namespace std;
int n, m, val = 0, s, d, sd, dd;
vector<pair<int, int> > ans;
int par[200005], vis[200005];
vector<int> adj[200005];
map<int, int> M1, M2;
int find(int x) {
  if (par[x] != x) par[x] = find(par[x]);
  return par[x];
}
int Union(int x, int y) {
  int xset = find(x);
  int yset = find(y);
  if (xset == yset) return 0;
  par[xset] = yset;
  return 1;
}
void rec(int u) {
  if (u == s || u == d || vis[u] == 1) return;
  vis[u] = 1;
  for (int i = 0; i < adj[u].size(); i++) {
    int v = adj[u][i];
    if (!vis[v] && v != s && v != d) {
      ans.push_back(make_pair(u, v));
      rec(v);
    }
  }
}
int main() {
  cin >> n >> m;
  int i, j, k, l;
  for (i = 1; i < m + 1; i++) {
    int x, y;
    cin >> x >> y;
    adj[x].push_back(y);
    adj[y].push_back(x);
  }
  cin >> s >> d >> sd >> dd;
  for (i = 1; i < n + 1; i++) par[i] = i;
  for (i = 1; i < n + 1; i++) {
    int u = i;
    for (j = 0; j < adj[i].size(); j++) {
      int v = adj[i][j];
      if (v != s && v != d && u != s && u != d) {
        Union(u, v);
        rec(v);
        rec(u);
      }
    }
  }
  for (j = 0; j < adj[s].size(); j++) {
    M1[find(adj[s][j])] = j;
  }
  for (j = 0; j < adj[d].size(); j++) {
    M2[find(adj[d][j])] = j;
  }
  for (auto it = M1.begin(); it != M1.end();) {
    if (M2.find(it->first) == M2.end() && it->first != d) {
      Union(s, adj[s][it->second]);
      ans.push_back(make_pair(s, adj[s][it->second]));
      it = M1.erase(it);
      sd--;
    } else
      it++;
  }
  for (auto it = M2.begin(); it != M2.end();) {
    if (M1.find(it->first) == M1.end() && it->first != s) {
      Union(d, adj[d][it->second]);
      ans.push_back(make_pair(d, adj[d][it->second]));
      it = M2.erase(it);
      dd--;
    } else
      it++;
  }
  assert(M1.size() == M2.size());
  int f = 0;
  for (auto it : M1) {
    if (M2.find(it.first) == M2.end()) continue;
    int si = M2[it.first];
    int first = it.second;
    if (!f) {
      f = 1;
      ans.push_back(make_pair(s, adj[s][first]));
      Union(s, adj[s][first]);
      ans.push_back(make_pair(d, adj[d][si]));
      Union(d, adj[d][si]);
      sd--;
      dd--;
    } else {
      if (sd > dd) {
        ans.push_back(make_pair(s, adj[s][first]));
        sd--;
        Union(s, adj[s][first]);
      } else {
        ans.push_back(make_pair(d, adj[d][si]));
        dd--;
        Union(d, adj[d][si]);
      }
    }
  }
  if (find(s) == find(d)) {
  } else {
    sd--;
    dd--;
    auto it1 = M1.begin(), it2 = M2.begin();
    ans.push_back(make_pair(s, d));
  }
  M1.clear();
  M2.clear();
  if (sd >= 0 && dd >= 0) {
    cout << "Yes" << endl;
    for (i = 0; i < ans.size(); i++) {
      cout << ans[i].first << " " << ans[i].second << endl;
    }
  } else {
    cout << "No" << endl;
  }
}
