#include <bits/stdc++.h>
using namespace std;
const int sz = 1500000;
const long long MAX = 10000000000000000;
template <typename T>
T abs(T a) {
  return a < 0 ? -a : a;
}
int main() {
  long long n, m, h, t;
  cin >> n >> m >> h >> t;
  vector<vector<long long> > g(n + 1);
  for (long long i = 0; i < m; i++) {
    long long u, v;
    scanf("%lld %lld", &u, &v);
    g[u].push_back(v);
    g[v].push_back(u);
  }
  map<long long, long long> heads;
  map<long long, long long> bodies;
  long long t1, t2;
  map<pair<long long, long long>, bool> used;
  bool ok = false;
  bool f;
  for (long long i = 0; i < n + 1; i++) {
    if (ok) break;
    for (long long j = 0; j < g[i].size(); j++) {
      f = false;
      if (heads[i] == 1 || bodies[g[i][j]] == 1) continue;
      if (g[i].size() < h + 1) {
        heads[i] = 1;
        f = true;
      }
      if (g[g[i][j]].size() < h + 1) {
        heads[g[i][j]] = 1;
      }
      if (g[i].size() < t + 1) {
        bodies[i] = 1;
      }
      if (g[g[i][j]].size() < t + 1) {
        bodies[g[i][j]] = 1;
        f = true;
      }
      if (f) continue;
      if (g[i].size() >= (h + t) + 1 || g[g[i][j]].size() >= (h + t + 1)) {
        t1 = i, t2 = g[i][j];
        ok = true;
        break;
      }
      vector<long long> tmp(n + 1, 0);
      for (long long k = 0; k < g[i].size(); k++) {
        tmp[g[i][k]] += 1;
      }
      for (long long k = 0; k < g[g[i][j]].size(); k++) {
        tmp[g[g[i][j]][k]] -= 1;
      }
      long long intersec = 0;
      for (long long k = 0; k < g[i].size(); k++) {
        if (tmp[g[i][k]] == 0) intersec++;
      }
      if (g[i].size() + g[g[i][j]].size() - intersec >= h + t + 2) {
        t1 = i;
        t2 = g[i][j];
        ok = true;
        break;
      }
    }
  }
  if (!ok) {
    cout << "NO" << endl;
    return 0;
  }
  map<long long, long long> cont;
  long long chest = t1, body = t2;
  for (long long i = 0; i < g[t1].size(); i++) {
    if (g[t1][i] != t2) cont[g[t1][i]] += 1;
  }
  for (long long i = 0; i < g[t2].size(); i++) {
    if (g[t2][i] != t1) cont[g[t2][i]] -= 1;
  }
  vector<long long> one, two;
  one.reserve(1e5);
  two.reserve(1e5);
  for (map<long long, long long>::iterator it = cont.begin(); it != cont.end();
       ++it) {
    if (it->second == 1) {
      one.push_back(it->first);
    }
    if (it->second == -1) {
      two.push_back(it->first);
    }
  }
  for (map<long long, long long>::iterator it = cont.begin(); it != cont.end();
       ++it) {
    if (it->second == 0) {
      if (one.size() < h) {
        one.push_back(it->first);
      } else if (two.size() < t) {
        two.push_back(it->first);
      } else
        break;
    }
  }
  cout << "YES" << endl;
  cout << t1 << " " << t2 << endl;
  for (long long i = 0; i < h; i++) {
    long long tmp = one[i];
    cout << tmp << " ";
  }
  cout << endl;
  for (long long i = 0; i < t; i++) {
    long long tmp = two[i];
    cout << tmp << " ";
  }
  cout << endl;
  return 0;
}
