#include <bits/stdc++.h>
using namespace std;
int A[100005], B[100005];
vector<int> adj[100005];
bool vis[100005];
int N, M, H, T;
vector<int> x, y;
vector<int> com;
int maxi, j, k, i;
void print() {
  for (j = 0; j < (int)com.size(); j++) vis[com[j]] = 1;
  if ((x.size() < y.size() && H > T) || (x.size() > y.size() && H < T)) {
    swap(x, y);
    swap(A[i], B[i]);
  }
  printf("YES\n%d %d\n", A[i] + 1, B[i] + 1);
  bool ff = 0;
  for (j = 0; j < (int)x.size(); j++) {
    if (!vis[x[j]]) {
      H--;
      if (ff) printf(" ");
      printf("%d", x[j] + 1);
      ff = 1;
      if (!H) break;
    }
  }
  if (H) {
    for (j = 0; j < (int)com.size(); j++) {
      H--;
      if (ff) printf(" ");
      printf("%d", com[j] + 1);
      ff = 1;
      if (!H) break;
    }
    vector<int> ncom;
    for (j++; j < (int)com.size(); j++) ncom.push_back(com[j]);
    com = ncom;
  }
  printf("\n");
  ff = 0;
  for (j = 0; j < (int)y.size(); j++) {
    if (!vis[y[j]]) {
      T--;
      if (ff) printf(" ");
      printf("%d", y[j] + 1);
      ff = 1;
      if (!T) break;
    }
  }
  if (T) {
    for (j = 0; j < (int)com.size(); j++) {
      T--;
      if (ff) printf(" ");
      printf("%d", com[j] + 1);
      ff = 1;
      if (!T) break;
    }
  }
  printf("\n");
}
void getCommon() {
  j = 0, k = 0;
  while (1) {
    if (j >= (int)x.size() || k >= (int)y.size()) break;
    if (x[j] == y[k]) {
      com.push_back(x[j]);
      j++;
      k++;
    } else if (x[j] < y[k])
      j++;
    else
      k++;
  }
}
bool check() {
  return (int)x.size() + (int)y.size() - (int)com.size() >= H + T &&
         (int)min(x.size(), y.size()) >= min(H, T) &&
         (int)max(x.size(), y.size()) >= max(H, T);
}
int main() {
  scanf("%d %d", &N, &M);
  scanf("%d %d", &H, &T);
  for (i = 0; i < M; i++) {
    scanf("%d %d", &A[i], &B[i]);
    A[i]--, B[i]--;
    adj[A[i]].push_back(B[i]);
    adj[B[i]].push_back(A[i]);
  }
  for (i = 0; i < N; i++) sort(adj[i].begin(), adj[i].end());
  for (i = 0; i < M; i++) {
    if ((int)adj[A[i]].size() + (int)adj[B[i]].size() - 2 < H + T) continue;
    x.clear();
    y.clear();
    maxi = min((int)adj[A[i]].size(), H + T + 2);
    for (j = 0; j < maxi; j++) {
      if (adj[A[i]][j] == B[i]) continue;
      x.push_back(adj[A[i]][j]);
    }
    maxi = min((int)adj[B[i]].size(), H + T + 2);
    for (j = 0; j < maxi; j++) {
      if (adj[B[i]][j] == A[i]) continue;
      y.push_back(adj[B[i]][j]);
    }
    com.clear();
    getCommon();
    if (check()) {
      print();
      return 0;
    }
  }
  printf("NO\n");
}
