#include <bits/stdc++.h>
using namespace std;
typedef struct {
  vector<int> edge;
  int deg;
} vert;
int n, m, h, t;
vert vt[100005];
void print_ans(int u, int v) {
  printf("YES\n");
  printf("%d %d\n", u, v);
  vector<int> common;
  vector<int> head;
  vector<int> tail;
  int p1 = 0, p2 = 0;
  while (p1 != vt[u].deg || p2 != vt[v].deg) {
    if (p1 == vt[u].deg) {
      if (vt[v].edge[p2] != u) {
        tail.push_back(vt[v].edge[p2]);
      }
      p2++;
    } else if (p2 == vt[v].deg) {
      if (vt[u].edge[p1] != v) {
        head.push_back(vt[u].edge[p1]);
      }
      p1++;
    } else {
      int w1 = vt[u].edge[p1];
      int w2 = vt[v].edge[p2];
      if (w1 == v) {
        p1++;
        continue;
      }
      if (w2 == u) {
        p2++;
        continue;
      }
      if (w1 < w2) {
        head.push_back(w1);
        p1++;
      } else if (w1 > w2) {
        tail.push_back(w2);
        p2++;
      } else {
        common.push_back(w1);
        p1++;
        p2++;
      }
    }
  }
  int shead = head.size();
  int stail = tail.size();
  for (int i = 0; i < h; i++) {
    if (i < shead) {
      printf("%d ", head[i]);
    } else {
      printf("%d ", common[i - shead]);
    }
  }
  printf("\n");
  for (int i = 0; i < t; i++) {
    if (i < stail) {
      printf("%d ", tail[i]);
    } else {
      printf("%d ", common[i - stail + h - min(h, shead)]);
    }
  }
  printf("\n");
  fflush(stdin);
  getchar();
}
int main() {
  scanf("%d %d %d %d", &n, &m, &h, &t);
  for (int i = 0; i < m; i++) {
    int a, b;
    scanf("%d %d", &a, &b);
    vt[a].edge.push_back(b);
    vt[b].edge.push_back(a);
  }
  for (int i = 1; i <= n; i++) {
    vt[i].deg = vt[i].edge.size();
    sort(vt[i].edge.begin(), vt[i].edge.end());
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < vt[i].deg; j++) {
      int u = i;
      int v = vt[i].edge[j];
      if (vt[u].deg < h + 1 || vt[v].deg < t + 1) continue;
      int curh = 0, curt = 0, curb = 0;
      int p1 = 0, p2 = 0;
      while (p1 != vt[u].deg && p2 != vt[v].deg) {
        int w1 = vt[u].edge[p1];
        int w2 = vt[v].edge[p2];
        if (w1 < w2) {
          curh++;
          p1++;
        } else if (w1 > w2) {
          curt++;
          p2++;
        } else {
          curb++;
          p1++;
          p2++;
        }
        if (curh + curb + curt >= h + t + 2 && curh + curb >= h + 1 &&
            curt + curb >= t + 1) {
          break;
        }
      }
      if (p1 < vt[u].deg) {
        curh += vt[u].deg - p1;
      }
      if (p2 < vt[v].deg) {
        curt += vt[v].deg - p2;
      }
      if (curh + curb + curt >= h + t + 2 && curh + curb >= h + 1 &&
          curt + curb >= t + 1) {
        print_ans(u, v);
        return 0;
      }
    }
  }
  printf("NO\n");
  fflush(stdin);
  getchar();
}
