#include <bits/stdc++.h>
using namespace std;
int n, m, s, t, ds, dt;
long long Arr[200005], Size[200005];
int a[200005], b[200005], c[200005];
bool flag;
vector<int> adj[200005];
vector<pair<int, int>> edges, ans;
int root(long long Arr[], int i) {
  while (Arr[i] != i) {
    Arr[i] = Arr[Arr[i]];
    i = Arr[i];
  }
  return i;
}
void Union(long long Arr[], long long Size[], int A, int B) {
  int rootA = root(Arr, A);
  int rootB = root(Arr, B);
  if (Size[rootA] < Size[rootB]) {
    Arr[rootA] = rootB;
    Size[rootB] += Size[rootA];
  } else {
    Arr[rootB] = rootA;
    Size[rootA] += Size[rootB];
  }
}
void initialize(long long Arr[], long long Size[], int nn) {
  for (int i = 1; i <= nn; ++i) {
    Arr[i] = i;
    Size[i] = 1;
  }
}
bool Find(long long Arr[], int A, int B) {
  return (root(Arr, A) == root(Arr, B)) ? 1 : 0;
}
int main() {
  cin >> n >> m;
  initialize(Arr, Size, n);
  for (int i = 0; i < m; ++i) {
    int x, y;
    cin >> x >> y;
    adj[x].push_back(y);
    adj[y].push_back(x);
    edges.push_back({x, y});
  }
  cin >> s >> t >> ds >> dt;
  for (int i = 0; i < m; ++i) {
    int x = edges[i].first;
    int y = edges[i].second;
    if (x != s && x != t && y != s && y != t && !Find(Arr, x, y)) {
      Union(Arr, Size, x, y);
      ans.push_back({x, y});
    }
  }
  for (auto nx : adj[s])
    if (nx != t) {
      int r = root(Arr, nx);
      a[r] = 1;
      b[r] = nx;
    }
  for (auto nx : adj[t])
    if (nx != s) {
      int r = root(Arr, nx);
      a[r] = (a[r] == 1 || a[r] == 3) ? 3 : 2;
      c[r] = nx;
    }
  for (int i = 1; i <= n; ++i) {
    if (a[i] == 1) {
      --ds;
      ans.push_back({s, b[i]});
    } else if (a[i] == 2) {
      --dt;
      ans.push_back({t, c[i]});
    }
  }
  for (int i = 1; i <= n; ++i)
    if (a[i] == 3) {
      if (!flag) {
        --ds;
        ans.push_back({s, b[i]});
        --dt;
        ans.push_back({t, c[i]});
        flag = 1;
      } else {
        if (ds >= dt) {
          --ds;
          ans.push_back({s, b[i]});
        } else {
          --dt;
          ans.push_back({t, c[i]});
        }
      }
    }
  if (!flag) {
    ans.push_back({s, t});
    --ds;
    --dt;
  }
  if (ds < 0 || dt < 0) return cout << "No", 0;
  cout << "Yes\n";
  for (auto nx : ans) cout << nx.first << " " << nx.second << "\n";
  return 0;
}
