#include <bits/stdc++.h>   using namespace std;   int p[400050];   int ran[400050];   int find_set(int a) { return p[a] == a ? a : (p[a] = find_set(p[a])); }   int unite(int a, int b) {     int x = find_set(a);     int y = find_set(b);     if (x == y) return -1;     if (ran[x] < ran[y]) {       p[x] = y;     } else {       p[y] = x;       if (ran[x] == ran[y]) ran[x]++;     }     return 0;   }   pair<int, pair<int, int> > ed[400050];   int viz[200050];   int main() {     int n, m;     int s, t, ds, dt;     int di = 0, dii = 0;     int tes = 0;     scanf( %d %d , &n, &m);     for (int i = 0; i < m; i++) {       int a, b;       scanf( %d %d , &a, &b);       ed[i] = make_pair(0, make_pair(a, b));     }     scanf( %d %d %d %d , &s, &t, &ds, &dt);     for (int i = 0; i < m; i++) {       if ((ed[i].second.first == s && ed[i].second.second == t) ||           (ed[i].second.second == s && ed[i].second.first == t)) {         ed[i] = make_pair(2, make_pair(ed[i].second.first, ed[i].second.second));       } else if (ed[i].second.first == s || ed[i].second.second == s) {         ed[i] = make_pair(1, make_pair(ed[i].second.first, ed[i].second.second));         viz[ed[i].second.first] |= 1;         viz[ed[i].second.second] |= 1;       } else if (ed[i].second.first == t || ed[i].second.second == t) {         ed[i] = make_pair(1, make_pair(ed[i].second.first, ed[i].second.second));         viz[ed[i].second.first] |= 2;         viz[ed[i].second.second] |= 2;       }     }     sort(ed, ed + m);     for (int i = 0; i <= n; i++) {       p[i] = i;       ran[i] = 1;     }     int i;     for (i = 0; i < m; i++) {       if (ed[i].first) break;       if (find_set(ed[i].second.first) != find_set(ed[i].second.second)) {         tes++;         unite(ed[i].second.first, ed[i].second.second);         ed[i] = make_pair(-1, make_pair(ed[i].second.first, ed[i].second.second));       }     }     for (int j = i; j < m; j++) {       int q = (ed[j].second.first == s || ed[j].second.first == t)                   ? ed[j].second.second                   : ed[j].second.first;       if (ed[j].first == 2) break;       if (viz[q] == 3) continue;       if (find_set(ed[j].second.first) != find_set(ed[j].second.second)) {         if (ed[j].second.first == s || ed[j].second.second == s) {           if (di == ds) continue;           di++;         }         if (ed[j].second.first == t || ed[j].second.second == t) {           if (dii == dt) continue;           dii++;         }         tes++;         unite(ed[j].second.first, ed[j].second.second);         ed[j] = make_pair(-1, make_pair(ed[j].second.first, ed[j].second.second));       }     }     for (int j = i; j < m; j++) {       if (find_set(ed[j].second.first) != find_set(ed[j].second.second)) {         if (ed[j].second.first == s || ed[j].second.second == s) {           if (di == ds) continue;           di++;         }         if (ed[j].second.first == t || ed[j].second.second == t) {           if (dii == dt) continue;           dii++;         }         tes++;         unite(ed[j].second.first, ed[j].second.second);         ed[j] = make_pair(-1, make_pair(ed[j].second.first, ed[j].second.second));       }     }     if (tes != n - 1) {       printf( No n );     } else {       printf( Yes n );       for (int i = 0; i < m; i++) {         if (ed[i].first == -1)           printf( %d %d n , ed[i].second.first, ed[i].second.second);       }     }     return 0;   }