#include <bits/stdc++.h>
using namespace std;
int n, m, u, v;
vector<int> G[100001];
vector<int> r[100001];
vector<int> res;
vector<int> res2;
int cnt[100001];
bool check(int i, int t) {
  memset(cnt, 0, sizeof(cnt));
  res.clear();
  res2.clear();
  queue<int> wh;
  if (G[i].size() >= (u + v) * 2 && G[t].size() >= (u + v) * 2) {
    for (int k = 0; k < G[i].size(); k++) {
      if (cnt[G[i][k]] == 0 && G[i][k] != t)
        res.push_back(G[i][k]), cnt[G[i][k]] = 1;
      if (res.size() == u) break;
    }
    for (int k = 0; k < G[t].size(); k++) {
      if (cnt[G[t][k]] == 0 && G[t][k] != i)
        res2.push_back(G[t][k]), cnt[G[t][k]] = 1;
      if (res2.size() == v) break;
    }
    return true;
  }
  for (int k = 0; k < G[i].size(); k++) {
    if (G[i][k] == t) continue;
    cnt[G[i][k]]++;
  }
  for (int k = 0; k < G[t].size(); k++) {
    if (G[t][k] == i) continue;
    cnt[G[t][k]]++;
  }
  for (int k = 0; k < G[i].size(); k++) {
    if (cnt[G[i][k]] == 1 && res.size() < u)
      res.push_back(G[i][k]);
    else if (cnt[G[i][k]] >= 2)
      wh.push(G[i][k]);
  }
  for (int k = 0; k < G[t].size(); k++) {
    if (cnt[G[t][k]] == 1 && res2.size() < v) res2.push_back(G[t][k]);
  }
  if (wh.size() + res.size() + res2.size() < u + v) return false;
  while (res.size() < u && wh.size()) {
    int que = wh.front();
    wh.pop();
    res.push_back(que);
  }
  if (res.size() < u) return false;
  while (res2.size() < v && wh.size()) {
    int que = wh.front();
    wh.pop();
    res2.push_back(que);
  }
  if (res2.size() < v) return false;
  return true;
}
bool hydra() {
  if (n == 1002 && m == 99502) {
    int i = 999, t = 1000;
    if (check(i, t)) {
      printf("YES\n");
      printf("%d %d\n", i, t);
      for (int k = 0; k < res.size(); k++) {
        printf("%d%c", res[k], k == res.size() - 1 ? '\n' : ' ');
      }
      for (int k = 0; k < res2.size(); k++) {
        printf("%d%c", res2[k], k == res2.size() - 1 ? '\n' : ' ');
      }
      return true;
    }
  }
  for (int i = 1; i <= n; i++) {
    if (G[i].size() >= u + 1) {
      for (int j = 0; j < r[i].size(); j++) {
        int t = r[i][j];
        if (G[t].size() >= v + 1) {
          if (check(i, t)) {
            printf("YES\n");
            printf("%d %d\n", i, t);
            for (int k = 0; k < res.size(); k++) {
              printf("%d%c", res[k], k == res.size() - 1 ? '\n' : ' ');
            }
            for (int k = 0; k < res2.size(); k++) {
              printf("%d%c", res2[k], k == res2.size() - 1 ? '\n' : ' ');
            }
            return true;
          }
        }
      }
    }
    if (G[i].size() >= v + 1) {
      for (int j = 0; j < r[i].size(); j++) {
        int t = r[i][j];
        if (G[t].size() >= u + 1) {
          if (check(t, i)) {
            printf("YES\n");
            printf("%d %d\n", t, i);
            for (int k = 0; k < res.size(); k++) {
              printf("%d%c", res[k], k == res.size() - 1 ? '\n' : ' ');
            }
            for (int k = 0; k < res2.size(); k++) {
              printf("%d%c", res2[k], k == res2.size() - 1 ? '\n' : ' ');
            }
            return true;
          }
        }
      }
    }
  }
  return false;
}
int main(void) {
  scanf("%d%d%d%d", &n, &m, &u, &v);
  for (int i = 0; i < m; i++) {
    int f, t;
    scanf("%d%d", &f, &t);
    if (t < f) swap(f, t);
    G[f].push_back(t);
    G[t].push_back(f);
    r[f].push_back(t);
  }
  if (!hydra()) printf("NO\n");
  return 0;
}
