#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 100;
int n, m, h, t, deg[N], mark[N];
vector<pair<int, int> > e;
vector<int> adj[N], com;
void output(int u, int v) {
  for (int i : adj[v]) mark[i]++;
  for (int i : adj[u]) mark[i]++;
  for (int i = 0; i < n; i++)
    if (mark[i] == 2) com.push_back(i);
  cout << "YES" << endl << u + 1 << " " << v + 1 << endl;
  for (int i : adj[u]) {
    if (mark[i] == 1 && i != v) cout << i + 1 << " ", h--;
    if (!h) break;
  }
  int pt = 0;
  while (h) cout << com[pt] + 1 << " ", pt++, h--;
  cout << endl;
  for (int i : adj[v]) {
    if (mark[i] == 1 && i != u) cout << i + 1 << " ", t--;
    if (!t) break;
  }
  while (t) cout << com[pt] + 1 << " ", pt++, t--;
  cout << endl;
  exit(0);
}
int common(int u, int v) {
  if (deg[u] < deg[v]) swap(u, v);
  int c = 0;
  for (int i = 0; i < adj[v].size(); i++) {
    int k =
        lower_bound(adj[u].begin(), adj[u].end(), adj[v][i]) - adj[u].begin();
    if (k != adj[u].size() && adj[u][k] == adj[v][i]) c++;
  }
  return c;
}
int main() {
  cin >> n >> m >> h >> t;
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    adj[--u].push_back(--v);
    adj[v].push_back(u);
    deg[u]++, deg[v]++;
    e.push_back({u, v});
    e.push_back({v, u});
  }
  for (int i = 0; i < n; i++) sort(adj[i].begin(), adj[i].end());
  for (pair<int, int> edge : e) {
    int u = edge.first;
    int v = edge.second;
    if (deg[u] > h + t && deg[v] > h + t) output(u, v);
    int c = common(u, v);
    int udeg = deg[u] - c;
    int vdeg = deg[v] - c;
    c -= max(0, h + 1 - udeg);
    c -= max(0, t + 1 - vdeg);
    if (c >= 0) output(u, v);
  }
  cout << "NO" << endl;
}
