#include <bits/stdc++.h>
using namespace std;
struct DisjointSets {
  int comp;
  int par[200000];
  int rank[200000];
  DisjointSets(int n) {
    comp = n;
    for (int i = 0; i < n; ++i) {
      par[i] = i;
      rank[i] = 1;
    }
  }
  int find(int a) { return par[a] == a ? a : par[a] = find(par[a]); }
  void join(int a, int b) {
    a = find(a), b = find(b);
    if (a == b) {
      return;
    }
    --comp;
    if (rank[a] < rank[b]) {
      swap(a, b);
    } else if (rank[a] == rank[b]) {
      ++rank[a];
    }
    par[b] = a;
  }
  bool isConnected(int a, int b) { return find(a) == find(b); }
};
bool fu_4(int s, int t, vector<pair<int, int>> &usedEdges, DisjointSets &dsu,
          int &ds, const vector<vector<int>> &adj);
void fu_1(const vector<vector<int>> &adj, int a, int b, int &d,
          vector<pair<int, int>> &usedEdges, DisjointSets &dsu) {
  set<int> bHasEdgesTo;
  bHasEdgesTo.insert(dsu.find(b));
  for (int v : adj[b]) {
    bHasEdgesTo.insert(dsu.find(v));
  }
  for (int v : adj[a]) {
    if (!bHasEdgesTo.count(dsu.find(v)) && !dsu.isConnected(a, v)) {
      --d;
      dsu.join(a, v);
      usedEdges.emplace_back(a, v);
    }
  }
}
void fu_2(int s, int t, vector<pair<int, int>> &usedEdges, DisjointSets &dsu,
          int &du, const vector<vector<int>> &adj) {
  for (int v : adj[s]) {
    if (v != t && du > 0 && !dsu.isConnected(s, v)) {
      --du;
      dsu.join(s, v);
      usedEdges.emplace_back(s, v);
    }
  }
}
bool fu_3(vector<pair<int, int>> usedEdges) {
  cout << "Yes\n";
  for (auto p : usedEdges) {
    cout << p.first + 1 << ' ' << p.second + 1 << '\n';
  }
  return true;
}
bool fu_4(int s, int t, vector<pair<int, int>> &usedEdges, DisjointSets &dsu,
          int &ds, const vector<vector<int>> &adj) {
  if (dsu.isConnected(s, t)) {
    return true;
  }
  bool ok = false;
  for (int v : adj[s]) {
    if (v != t && dsu.isConnected(t, v)) {
      --ds;
      ok = true;
      dsu.join(s, v);
      usedEdges.push_back({s, v});
      break;
    }
  }
  return ok;
}
bool strategy_1(int s, int t, int ds, int dt, const vector<vector<int>> &adj,
                vector<pair<int, int>> usedEdges, DisjointSets dsu) {
  if (find(adj[s].begin(), adj[s].end(), t) == adj[s].end()) {
    return false;
  }
  --ds, --dt;
  dsu.join(s, t);
  usedEdges.push_back({s, t});
  fu_2(s, t, usedEdges, dsu, ds, adj);
  fu_2(t, s, usedEdges, dsu, dt, adj);
  if (ds >= 0 && dt >= 0 && dsu.comp == 1) {
    return fu_3(usedEdges);
  }
  return false;
}
bool strategy_2(int s, int t, int ds, int dt, const vector<vector<int>> &adj,
                vector<pair<int, int>> usedEdges, DisjointSets dsu) {
  bool ok = fu_4(s, t, usedEdges, dsu, ds, adj);
  fu_2(s, t, usedEdges, dsu, ds, adj);
  fu_2(t, s, usedEdges, dsu, dt, adj);
  if (!ok) {
    ok = fu_4(s, t, usedEdges, dsu, ds, adj);
  }
  if (ok && ds >= 0 && dt >= 0 && dsu.comp == 1) {
    return fu_3(usedEdges);
  }
  return false;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL), cout.tie(NULL);
  int n, m;
  cin >> n >> m;
  vector<vector<int>> adj(n);
  vector<pair<int, int>> edges;
  for (int i = 0; i < m; ++i) {
    int a, b;
    cin >> a >> b;
    edges.emplace_back(--a, --b);
    adj[a].push_back(b);
    adj[b].push_back(a);
  }
  int s, t, ds, dt;
  DisjointSets dsu(n);
  vector<pair<int, int>> usedEdges;
  cin >> s >> t >> ds >> dt;
  --s, --t;
  for (auto p : edges) {
    if (p.first != s && p.first != t && p.second != s && p.second != t &&
        !dsu.isConnected(p.first, p.second)) {
      usedEdges.push_back(p);
      dsu.join(p.first, p.second);
    }
  }
  fu_1(adj, s, t, ds, usedEdges, dsu);
  fu_1(adj, t, s, dt, usedEdges, dsu);
  if (!strategy_1(s, t, ds, dt, adj, usedEdges, dsu) &&
      !strategy_2(s, t, ds, dt, adj, usedEdges, dsu) &&
      !strategy_2(t, s, dt, ds, adj, usedEdges, dsu)) {
    cout << "No\n";
  }
  return 0;
}
