#include <bits/stdc++.h>
using namespace std;
const int MODULO = 1000000007;
const int INF = 100000000;
int a[100000];
bool b[4000001];
int N, A, B;
vector<pair<int, int> > edges;
vector<int> graph[100010];
bool c[100010];
bool check(int a, int b) {
  int i;
  int dega = 0, degb = 0, deg = 0;
  for (int i = 0; i < (graph[a].size()); i++) {
    int x = graph[a][i];
    if (x != b) {
      dega++;
      deg++;
      c[x] = true;
    }
  }
  for (int i = 0; i < (graph[b].size()); i++) {
    int x = graph[b][i];
    if (x != a) {
      degb++;
      if (!c[x]) deg++;
    }
  }
  for (int i = 0; i < (graph[a].size()); i++) {
    int x = graph[a][i];
    if (x != b) c[x] = false;
  }
  if (dega >= A && degb >= B && deg >= A + B) return true;
  return false;
}
void print(int a, int b) {
  cout << "YES" << endl;
  cout << a + 1 << ' ' << b + 1 << endl;
  set<int> sa, sb;
  for (int i = 0; i < (graph[a].size()); i++)
    if (graph[a][i] != b) sa.insert(graph[a][i]);
  for (int i = 0; i < (graph[b].size()); i++)
    if (graph[b][i] != a) sb.insert(graph[b][i]);
  vector<int> va, vb, both;
  for (__typeof((sa).begin()) itr = (sa).begin(); itr != (sa).end(); ++itr) {
    int x = (*itr);
    if (sb.find(x) == sb.end())
      va.push_back(x + 1);
    else
      both.push_back(x + 1);
  }
  for (__typeof((sb).begin()) itr = (sb).begin(); itr != (sb).end(); ++itr) {
    int x = (*itr);
    if (sa.find(x) == sa.end()) vb.push_back(x + 1);
  }
  while (va.size() > A) va.pop_back();
  while (vb.size() > B) vb.pop_back();
  while (va.size() < A) {
    va.push_back(both[both.size() - 1]);
    both.pop_back();
  }
  while (vb.size() < B) {
    vb.push_back(both[both.size() - 1]);
    both.pop_back();
  }
  for (int i = 0; i < (A); i++) {
    cout << va[i];
    if (i == A - 1)
      cout << endl;
    else
      cout << ' ';
  }
  for (int i = 0; i < (B); i++) {
    cout << vb[i];
    if (i == B - 1)
      cout << endl;
    else
      cout << ' ';
  }
}
int main(void) {
  int M, x, y;
  scanf("%d%d%d%d", &N, &M, &A, &B);
  for (int i = 0; i < (M); i++) {
    scanf("%d%d", &x, &y);
    x--;
    y--;
    edges.push_back(make_pair(x, y));
    if (graph[x].size() < 200) graph[x].push_back(y);
    if (graph[y].size() < 200) graph[y].push_back(x);
  }
  for (int i = 0; i < (edges.size()); i++) {
    int a = edges[i].first, b = edges[i].second;
    if (check(a, b)) {
      print(a, b);
      return 0;
    }
    if (check(b, a)) {
      print(b, a);
      return 0;
    }
  }
  cout << "NO" << endl;
  return 0;
}
