#include <bits/stdc++.h>
using namespace std;
template <class t, class u>
void chmax(t &first, u second) {
  if (first < second) first = second;
}
template <class t, class u>
void chmin(t &first, u second) {
  if (second < first) first = second;
}
int n, l;
vector<int> first;
bool exist(int x) { return binary_search(first.begin(), first.end(), x); }
bool solveShared(int x, int y, int &ans) {
  for (int v : first) {
    if (v - x > -1) {
      if (v - x - y > -1 && exist(v - x - y)) {
        ans = v - x;
        return 1;
      }
      if (v - x + y < l + 1 && exist(v - x + y)) {
        ans = v - x;
        return 1;
      }
    }
    if (v + x < l + 1) {
      if (v + x - y > -1 && exist(v + x - y)) {
        ans = v + x;
        return 1;
      }
      if (v + x + y < l + 1 && exist(v + x + y)) {
        ans = v + x;
        return 1;
      }
    }
  }
  return 0;
}
int solveUnshared(int x) {
  for (int v : first) {
    if (v + x < l + 1) return v + x;
    if (v - x > -1) return v - x;
  }
  assert(0);
  return -1;
}
bool baseCheck(int x) {
  for (int v : first) {
    if (v + x < l + 1 && exist(v + x)) return 1;
    if (v - x > -1 && exist(v - x)) return 1;
  }
  return 0;
}
int main() {
  int x, y;
  scanf("%d", &n);
  scanf("%d", &l);
  scanf("%d", &x);
  scanf("%d", &y);
  first.assign(n, 0);
  for (int rep = 0; rep < n; ++rep) scanf("%d", &first[rep]);
  bool ok_x = 0, ok_y = 0;
  if (baseCheck(x)) ok_x = 1;
  if (baseCheck(y)) ok_y = 1;
  if (ok_x && ok_y) return !printf("0\n");
  if (ok_x) {
    int ans = solveUnshared(y);
    return !printf("1\n%d\n", ans);
  } else if (ok_y) {
    int ans = solveUnshared(x);
    return !printf("1\n%d\n", ans);
  } else {
    int ans = -1;
    if (solveShared(x, y, ans)) return !printf("1\n%d\n", ans);
    printf("2\n");
    printf("%d %d\n", solveUnshared(x), solveUnshared(y));
  }
  return 0;
}
