#include <bits/stdc++.h>
using namespace std;
const int N = 100000 + 10;
int u[N], v[N], chk[N];
vector<int> vec[N];
int main() {
  int n, m, h, t;
  scanf("%d%d%d%d", &n, &m, &h, &t);
  for (int i = 0; i < m; i++) {
    scanf("%d%d", u + i, v + i);
    vec[u[i]].push_back(v[i]);
    vec[v[i]].push_back(u[i]);
  }
  for (int i = 0; i < m; i++) {
    int a = u[i], b = v[i];
    if (vec[a].size() < vec[b].size()) swap(a, b);
    if (vec[a].size() > 500) {
      if (vec[b].size() <= min(h, t)) continue;
      vector<int> tem1, tem2;
      for (int j = 0, cnt = 0; j < vec[b].size() and cnt < min(h, t); j++) {
        if (vec[b][j] == a) continue;
        cnt++;
        chk[vec[b][j]] = 1;
        tem1.push_back(vec[b][j]);
      }
      for (int j = 0, cnt = 0; j < vec[a].size() and cnt < max(h, t); j++) {
        if (vec[a][j] == b) continue;
        if (chk[vec[a][j]]) continue;
        cnt++;
        tem2.push_back(vec[a][j]);
      }
      puts("YES");
      if (tem1.size() == t) {
        printf("%d %d\n", a, b);
        for (int j = 0; j < tem2.size(); j++) {
          printf("%d%c", tem2[j], j < tem2.size() - 1 ? ' ' : '\n');
        }
        for (int j = 0; j < tem1.size(); j++) {
          printf("%d%c", tem1[j], j < tem1.size() - 1 ? ' ' : '\n');
        }
      } else {
        printf("%d %d\n", b, a);
        for (int j = 0; j < tem1.size(); j++) {
          printf("%d%c", tem1[j], j < tem1.size() - 1 ? ' ' : '\n');
        }
        for (int j = 0; j < tem2.size(); j++) {
          printf("%d%c", tem2[j], j < tem2.size() - 1 ? ' ' : '\n');
        }
      }
      return 0;
    }
    vector<int> tem1, tem2, tem3, vec1, vec2;
    for (int j = 0; j < vec[a].size(); j++) {
      chk[vec[a][j]] = 1;
    }
    for (int j = 0; j < vec[b].size(); j++) {
      if (vec[b][j] == a) continue;
      if (chk[vec[b][j]])
        tem3.push_back(vec[b][j]), chk[vec[b][j]] = 0;
      else
        tem2.push_back(vec[b][j]);
    }
    for (int j = 0; j < vec[a].size(); j++) {
      if (vec[a][j] == b) continue;
      if (chk[vec[a][j]]) tem1.push_back(vec[a][j]);
    }
    for (int j = 0; j < vec[a].size(); j++) {
      chk[vec[a][j]] = 0;
    }
    int sz1 = tem1.size(), sz2 = tem2.size(), sz3 = tem3.size();
    if (sz1 + sz2 + sz3 < h + t or sz1 + sz3 < max(h, t) or
        sz2 + sz3 < min(h, t))
      continue;
    int cnt = 0;
    for (int j = 0; j < tem2.size() and cnt < min(h, t); j++) {
      cnt++;
      vec2.push_back(tem2[j]);
    }
    for (int j = 0; j < tem3.size() and cnt < min(h, t); j++) {
      cnt++;
      vec2.push_back(tem3[j]);
    }
    cnt = 0;
    for (int j = 0; j < tem1.size() and cnt < max(h, t); j++) {
      cnt++;
      vec1.push_back(tem1[j]);
    }
    for (int j = tem3.size() - 1; j >= 0 and cnt < max(h, t); j--) {
      cnt++;
      vec1.push_back(tem3[j]);
    }
    assert(vec1.size() == max(h, t) and vec2.size() == min(h, t));
    puts("YES");
    if (vec1.size() == h) {
      printf("%d %d\n", a, b);
      for (int j = 0; j < vec1.size(); j++) {
        printf("%d%c", vec1[j], j < vec1.size() - 1 ? ' ' : '\n');
      }
      for (int j = 0; j < vec2.size(); j++) {
        printf("%d%c", vec2[j], j < vec2.size() - 1 ? ' ' : '\n');
      }
    } else {
      printf("%d %d\n", b, a);
      for (int j = 0; j < vec2.size(); j++) {
        printf("%d%c", vec2[j], j < vec2.size() - 1 ? ' ' : '\n');
      }
      for (int j = 0; j < vec1.size(); j++) {
        printf("%d%c", vec1[j], j < vec1.size() - 1 ? ' ' : '\n');
      }
    }
    return 0;
  }
  puts("NO");
}
