#include <bits/stdc++.h>
using namespace std;
vector<long long> v[500000];
map<pair<long long, pair<long long, long long> >, long long> ma;
pair<long long, long long> par[500000];
long long dis[500001];
bool vis[500000];
long long siz[500000];
void solve() {
  long long n, m, h, t;
  cin >> n >> m >> h >> t;
  vector<long long> a(m + 10), b(m + 10);
  for (long long i = 0; i < m; i++) {
    cin >> a[i] >> b[i];
    v[a[i]].push_back(b[i]);
    v[b[i]].push_back(a[i]);
  }
  vector<pair<long long, long long> > vp;
  for (long long i = 1; i < n + 1; i++) vp.push_back({v[i].size(), i});
  sort((vp).begin(), (vp).end());
  reverse((vp).begin(), (vp).end());
  for (long long i = 0; i < m; i++) {
    long long s1 = v[a[i]].size(), s2 = v[b[i]].size();
    if ((max(s1, s2) < (max(h, t) + 1)) || (min(s1, s2) < (min(h, t) + 1)))
      continue;
    else {
      long long counter = 0;
      for (auto x : v[a[i]]) {
        if (vis[x] == 0 && x != b[i]) {
          counter++;
          vis[x] = 1;
        }
        if (counter >= (t + h + 10)) break;
      }
      for (auto x : v[b[i]]) {
        if (vis[x] == 0 && x != a[i]) {
          counter++;
          vis[x] = 1;
        }
        if (counter >= (t + h + 10)) break;
      }
      if (counter < (h + t)) {
        for (auto x : v[a[i]]) {
          if (vis[x] == 1) {
            counter--;
            vis[x] = 0;
          }
          if (counter < 0) break;
        }
        for (auto x : v[b[i]]) {
          if (vis[x] == 1) {
            counter--;
            vis[x] = 0;
          }
          if (counter < 0) break;
        }
        continue;
      }
      {
        long long cnt = 0;
        cout << "YES" << endl;
        map<long long, long long> ma;
        long long re1, re2;
        if (h >= t) {
          if (v[a[i]].size() >= (h + 1)) {
            re1 = a[i];
            re2 = b[i];
          } else {
            re1 = b[i];
            re2 = a[i];
          }
        } else {
          if (v[a[i]].size() >= (t + 1)) {
            re1 = b[i];
            re2 = a[i];
          } else {
            re1 = a[i];
            re2 = b[i];
          }
        }
        queue<long long> common, fir, sec;
        for (auto x : v[re1]) {
          if (x != re2) {
            fir.push(x);
            ma[x] = 1;
          }
        }
        for (auto x : v[re2]) {
          if (ma[x] == 1) {
            common.push(x);
            ma[x] = 0;
          } else if (x != re1) {
            sec.push(x);
          }
          if (sec.size() > t) break;
        }
        cout << re1 << " " << re2 << endl;
        while (!fir.empty()) {
          if (ma[fir.front()] == 1) {
            cout << fir.front() << " ";
            cnt++;
          }
          fir.pop();
          if (cnt == h) break;
        }
        if (cnt < h) {
          while (!common.empty()) {
            cout << common.front() << " ";
            cnt++;
            common.pop();
            if (cnt == h) break;
          }
        }
        cout << endl;
        cnt = 0;
        while (!sec.empty()) {
          cout << sec.front() << " ";
          sec.pop();
          cnt++;
          if (cnt == t) break;
        }
        if (cnt < t) {
          while (!common.empty()) {
            cout << common.front() << " ";
            common.pop();
            cnt++;
            if (cnt == t) break;
          }
        }
        return;
      }
    }
  }
  cout << "NO" << endl;
  return;
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  ;
  long long t = 1;
  for (long long i = 0; i < t; i++) solve();
  return 0;
}
