#include <string>
#include <vector>
#include <map>
#include <list>
#include <iterator>
#include <cassert>
#include <set>
#include <queue>
#include <iostream>
#include <sstream>
#include <stack>
#include <deque>
#include <cmath>
#include <memory.h>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <algorithm>
#include <utility>
#include <time.h>
#include <complex>
#include <fstream>
#include <tuple>
#include <iomanip>

using namespace std;

#define forn(i, n) for (int i = 0; i < int(n); ++i)
#define for1(i, n) for (int i = 1; i < int(n); ++i)
#define ford(i, n) for (int i = int(n) - 1; i >= 0; --i)
#define fore(i, l, r) for (int i = int(l); i <= int(r); ++i)
#define all(a) a.begin(), a.end()
#define sz(a) (int(a.size()))
#define mp make_pair
#define pb push_back
#define ft first
#define sc second
#define g(a, b) get<a> (b)

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pt;

const ll MAX_N = 2e5;

int main(){
    int n, l, x, y;
    cin >> n >> l >> x >> y;
    vector <int> st(n);
    for (int i = 0; i < n; i++){
        scanf("%d", &st[i]);
    }
    bool pravda = false;
    for (int i = 0; i < n; i++){
        int kek = lower_bound(st.begin(), st.end(), st[i] + x) - st.begin();
        if (st[kek] - st[i] == x) {pravda = true; break;}
    }
    if (pravda){
        for (int i = 0; i < n; i++){
        int kek = lower_bound(st.begin(), st.end(), st[i] + y) - st.begin();
        if (st[kek] - st[i] == y) {cout << 0; return 0;}
        }
        cout << 1 << endl << y;
        return 0;
    }
    pravda = false;
    for (int i = 0; i < n; i++){
        int kek = lower_bound(st.begin(), st.end(), st[i] + y) - st.begin();
        if (st[kek] - st[i] == y) {pravda = true; break;}
        }
    if (pravda) {cout << 1 << endl << x; return 0;}
    for (int i = 0; i < n - 1; i++){
        int kek = lower_bound(st.begin(), st.end(), st[i] + y + x) - st.begin();
        if (st[kek] - st[i] - x == y){cout << 1 << endl << st[i] + x ;return 0;}
    }
    for (int i = 1; i < n; i++){
        int kek = lower_bound(st.begin(), st.end(), st[i] + y - x) - st.begin();
        if (st[kek] - st[i] + x == y){cout << 1 << endl << st[i] - x ;return 0;}
    }
    cout << 2 << endl << x << " " << y;
    return 0;
}


#include <string>
#include <vector>
#include <map>
#include <list>
#include <iterator>
#include <cassert>
#include <set>
#include <queue>
#include <iostream>
#include <sstream>
#include <stack>
#include <deque>
#include <cmath>
#include <memory.h>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <algorithm>
#include <utility>
#include <time.h>
#include <complex>
#include <fstream>
#include <tuple>
#include <iomanip>

using namespace std;

#define forn(i, n) for (int i = 0; i < int(n); ++i)
#define for1(i, n) for (int i = 1; i < int(n); ++i)
#define ford(i, n) for (int i = int(n) - 1; i >= 0; --i)
#define fore(i, l, r) for (int i = int(l); i <= int(r); ++i)
#define all(a) a.begin(), a.end()
#define sz(a) (int(a.size()))
#define mp make_pair
#define pb push_back
#define ft first
#define sc second
#define g(a, b) get<a> (b)

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pt;

const ll MAX_N = 2e5;

int main(){
    int n, l, x, y;
    cin >> n >> l >> x >> y;
    vector <int> st(n);
    for (int i = 0; i < n; i++){
        scanf("%d", &st[i]);
    }
    bool pravda = false;
    for (int i = 0; i < n; i++){
        int kek = lower_bound(st.begin(), st.end(), st[i] + x) - st.begin();
        if (st[kek] - st[i] == x) {pravda = true; break;}
    }
    if (pravda){
        for (int i = 0; i < n; i++){
        int kek = lower_bound(st.begin(), st.end(), st[i] + y) - st.begin();
        if (st[kek] - st[i] == y) {cout << 0; return 0;}
        }
        cout << 1 << endl << y;
        return 0;
    }
    pravda = false;
    for (int i = 0; i < n; i++){
        int kek = lower_bound(st.begin(), st.end(), st[i] + y) - st.begin();
        if (st[kek] - st[i] == y) {pravda = true; break;}
        }
    if (pravda) {cout << 1 << endl << x; return 0;}
    for (int i = 0; i < n - 1; i++){
        if (st[i] + x + y > l) continue;
        int kek = lower_bound(st.begin(), st.end(), st[i] + y + x) - st.begin();
        if (st[kek] - st[i] - x == y){cout << 1 << endl << st[i] + x ;return 0;}
    }
    for (int i = 1; i < n - 1; i++){
        if (st[i] - x < 0)continue;
        if (st[i] + y - x > l) continue;
        int kek = lower_bound(st.begin(), st.end(), st[i] + y - x) - st.begin();
        if (st[kek] - st[i] + x == y){cout << 1 << endl << st[i] - x ;return 0;}
    }
    for (int i = 1; i < n; i++){
        if (st[i] - x - y < 0)continue;
        int kek = lower_bound(st.begin(), st.end(), st[i] - y - x) - st.begin();
        if (st[i] - x - st[kek] == y){cout << 1 << endl << st[i] - x ;return 0;}
    }
    for (int i = 1; i < n; i++){
        if (st[i] + x - y < 0)continue;
        if (st[i] + x > l )continue;
        int kek = lower_bound(st.begin(), st.end(), st[i] - y + x) - st.begin();
        if (st[i] + x - st[kek] == y){cout << 1 << endl << st[i] + x ;return 0;}
    }
    cout << 2 << endl << x << " " << y;
    return 0;
}


#include <string>
#include <vector>
#include <map>
#include <list>
#include <iterator>
#include <cassert>
#include <set>
#include <queue>
#include <iostream>
#include <sstream>
#include <stack>
#include <deque>
#include <cmath>
#include <memory.h>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <algorithm>
#include <utility>
#include <time.h>
#include <complex>
#include <fstream>
#include <tuple>
#include <iomanip>

using namespace std;

#define forn(i, n) for (int i = 0; i < int(n); ++i)
#define for1(i, n) for (int i = 1; i < int(n); ++i)
#define ford(i, n) for (int i = int(n) - 1; i >= 0; --i)
#define fore(i, l, r) for (int i = int(l); i <= int(r); ++i)
#define all(a) a.begin(), a.end()
#define sz(a) (int(a.size()))
#define mp make_pair
#define pb push_back
#define ft first
#define sc second
#define g(a, b) get<a> (b)

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pt;

const ll MAX_N = 2e5;

int main(){
    int n, l, x, y;
    cin >> n >> l >> x >> y;
    vector <int> st(n);
    for (int i = 0; i < n; i++){
        scanf("%d", &st[i]);
    }
    bool pravda = false;
    for (int i = 0; i < n; i++){
        int kek = lower_bound(st.begin(), st.end(), st[i] + x) - st.begin();
        if (st[kek] - st[i] == x) {pravda = true; break;}
    }
    if (pravda){
        for (int i = 0; i < n; i++){
        int kek = lower_bound(st.begin(), st.end(), st[i] + y) - st.begin();
        if (st[kek] - st[i] == y) {cout << 0; return 0;}
        }
        cout << 1 << endl << y;
        return 0;
    }
    pravda = false;
    for (int i = 0; i < n; i++){
        int kek = lower_bound(st.begin(), st.end(), st[i] + y) - st.begin();
        if (st[kek] - st[i] == y) {pravda = true; break;}
        }
    if (pravda) {cout << 1 << endl << x; return 0;}
    for (int i = 0; i < n - 1; i++){
        int kek = lower_bound(st.begin(), st.end(), st[i] + y + x) - st.begin();
        if (st[kek] - st[i] - x == y){cout << 1 << endl << st[i] + x ;return 0;}
    }
    for (int i = 1; i < n; i++){
        if (st[i] - x < 0)continue;
        int kek = lower_bound(st.begin(), st.end(), st[i] + y - x) - st.begin();
        if (st[kek] - st[i] + x == y){cout << 1 << endl << st[i] - x ;return 0;}
    }
    cout << 2 << endl << x << " " << y;
    return 0;
}


#include <string>
#include <vector>
#include <map>
#include <list>
#include <iterator>
#include <cassert>
#include <set>
#include <queue>
#include <iostream>
#include <sstream>
#include <stack>
#include <deque>
#include <cmath>
#include <memory.h>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <algorithm>
#include <utility>
#include <time.h>
#include <complex>
#include <fstream>
#include <tuple>
#include <iomanip>

using namespace std;

#define forn(i, n) for (int i = 0; i < int(n); ++i)
#define for1(i, n) for (int i = 1; i < int(n); ++i)
#define ford(i, n) for (int i = int(n) - 1; i >= 0; --i)
#define fore(i, l, r) for (int i = int(l); i <= int(r); ++i)
#define all(a) a.begin(), a.end()
#define sz(a) (int(a.size()))
#define mp make_pair
#define pb push_back
#define ft first
#define sc second
#define g(a, b) get<a> (b)

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pt;

const ll MAX_N = 2e5;

int main(){
    int n, l, x, y;
    cin >> n >> l >> x >> y;
    vector <int> st(n);
    for (int i = 0; i < n; i++){
        scanf("%d", &st[i]);
    }
    bool pravda = false;
    for (int i = 0; i < n; i++){
        int kek = lower_bound(st.begin(), st.end(), st[i] + x) - st.begin();
        if (st[kek] - st[i] == x) {pravda = true; break;}
    }
    if (pravda){
        for (int i = 0; i < n; i++){
        int kek = lower_bound(st.begin(), st.end(), st[i] + y) - st.begin();
        if (st[kek] - st[i] == y) {cout << 0; return 0;}
        }
        cout << 1 << endl << y;
        return 0;
    }
    pravda = false;
    for (int i = 0; i < n; i++){
        int kek = lower_bound(st.begin(), st.end(), st[i] + y) - st.begin();
        if (st[kek] - st[i] == y) {pravda = true; break;}
        }
    if (pravda) {cout << 1 << endl << x; return 0;}
    for (int i = 0; i < n - 1; i++){
        int kek = lower_bound(st.begin(), st.end(), st[i] + y + x) - st.begin();
        if (st[kek] - x == y){cout << 1 << endl << st[i] + x ;return 0;}
    }
    for (int i = 1; i < n; i++){
        int kek = lower_bound(st.begin(), st.end(), st[i] + y - x) - st.begin();
        if (st[kek] - st[i] + x == y){cout << 1 << endl << st[i] - x ;return 0;}
    }
    cout << 2 << endl << x << " " << y;
    return 0;
}


#include <string>
#include <vector>
#include <map>
#include <list>
#include <iterator>
#include <cassert>
#include <set>
#include <queue>
#include <iostream>
#include <sstream>
#include <stack>
#include <deque>
#include <cmath>
#include <memory.h>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <algorithm>
#include <utility>
#include <time.h>
#include <complex>
#include <fstream>
#include <tuple>
#include <iomanip>

using namespace std;

#define forn(i, n) for (int i = 0; i < int(n); ++i)
#define for1(i, n) for (int i = 1; i < int(n); ++i)
#define ford(i, n) for (int i = int(n) - 1; i >= 0; --i)
#define fore(i, l, r) for (int i = int(l); i <= int(r); ++i)
#define all(a) a.begin(), a.end()
#define sz(a) (int(a.size()))
#define mp make_pair
#define pb push_back
#define ft first
#define sc second
#define g(a, b) get<a> (b)

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pt;

const ll MAX_N = 2e5;

int main(){
    int n, l, x, y;
    cin >> n >> l >> x >> y;
    vector <int> st(n);
    for (int i = 0; i < n; i++){
        scanf("%d", &st[i]);
    }
    bool pravda = false;
    for (int i = 0; i < n; i++){
        int kek = lower_bound(st.begin(), st.end(), st[i] + x) - st.begin();
        if (st[kek] - st[i] == x) {pravda = true; break;}
    }
    if (pravda){
        for (int i = 0; i < n; i++){
        int kek = lower_bound(st.begin(), st.end(), st[i] + y) - st.begin();
        if (st[kek] - st[i] == y) {cout << 0; return 0;}
        }
        cout << 1 << endl << y;
        return 0;
    }
    pravda = false;
    for (int i = 0; i < n; i++){
        int kek = lower_bound(st.begin(), st.end(), st[i] + y) - st.begin();
        if (st[kek] - st[i] == y) {pravda = true; break;}
        }
    if (pravda) {cout << 1 << endl << x; return 0;}
    for (int i = 0; i < n - 1; i++){
        int kek = lower_bound(st.begin(), st.end(), st[i] + y + x) - st.begin();
        if (st[kek] - st[i] - x == y){cout << 1 << endl << st[i] + x ;return 0;}
    }
    for (int i = 1; i < n; i++){
        if (st[i] - x < 0)continue;
        int kek = lower_bound(st.begin(), st.end(), st[i] + y - x) - st.begin();
        if (st[kek] - st[i] + x == y){cout << 1 << endl << st[i] - x ;return 0;}
    }
    for (int i = 1; i < n; i++){
        if (st[i] - x - y < 0)continue;
        int kek = lower_bound(st.begin(), st.end(), st[i] - y - x) - st.begin();
        if (st[i] - x - st[kek] == y){cout << 1 << endl << st[i] - x ;return 0;}
    }
    for (int i = 1; i < n; i++){
        if (st[i] + x - y < 0)continue;
        int kek = lower_bound(st.begin(), st.end(), st[i] - y + x) - st.begin();
        if (st[i] + x - st[kek] == y){cout << 1 << endl << st[i] + x ;return 0;}
    }
    cout << 2 << endl << x << " " << y;
    return 0;
}


                                // ALLAH \\
                        who is Hussain? -> whoishussain.org

#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,n,a) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define ALL(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long LL;
typedef pair<int,int> PII;
const int mod=1000000007;
LL powmod(LL a,LL b) {LL res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
int in(){ int x; scanf("%d",&x); return x; }

const int N = 1e5+100;
int n, l, x, y, a[N];
int check(int c){
        int j = 0;
        for(int i = 0;i < n;i ++){
                while(j<n && a[j]-a[i] < c) j++;
                if( a[j] - a[i] == c ) return a[j];
        }
        return 0;
}
vector<int> v[4];
int32_t main(){
        ios::sync_with_stdio(false),cin.tie(0);
        cin >> n >> l >> x >> y;
        for(int i = 0;i < n; i++) cin>>a[i];
        int tx = check(x), ty = check(y);
        if( !ty && tx ) return cout << 1 << endl << y,0;
        if( !tx && ty ) return cout << 1 << endl << x,0;
        if( tx ) return cout << 0 << endl,0;
        int txy = check(x+y);
        if( txy!=0 ) return cout << 1 <<endl << txy-x << endl,0;
        txy = check(y-x);
        if(!txy)        return cout << 2 << endl << x <<' ' << y << endl,0;
        if( txy + x <= l ) return cout << 1 << endl << txy+x<<endl,0;
        if( txy - y >= 0 ) return cout << 1 << endl << txy-y << endl,0;
}

// C/C++ File
// AUTHOR:   truth-seeker
// FILE:     480B.cpp
// ROLE:     TODO (some explanation)
// CREATED:  2017-01-16 15:24:46
// MODIFIED: 2017-01-16 15:24:46


                                // ALLAH \\
                        who is Hussain? -> whoishussain.org

#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,n,a) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define aLL(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long LL;
typedef pair<int,int> PII;
const int mod=1000000007;
LL powmod(LL a,LL b) {LL res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
int in(){ int x; scanf("%d",&x); return x; }

const int N = 1e5+100;
int n, l, x, y, a[N];
int check(int c){
        int i = 0, j = 0;
        for(int i = 0;i < n;i ++){
                while(j<n && a[j]-a[i] < c) j++;
                if( a[j] - a[i] == c ) return j;
        }
        return false;
}

int32_t main(){
        ios::sync_with_stdio(false),cin.tie(0);
        cin >> n >> l >> x >> y;
        for(int i = 0;i < n; i++) cin>>a[i];
        bool tx = check(x), ty = check(y);
        int txy = check(x+y);
        if( tx ^ ty ) if( ty ) return cout << 1 << endl << x,0; else return cout << 1 << endl << y,0;
        if( tx ) return cout << 0 << endl,0;
        if( txy!=0 ) return cout << 1 <<endl << a[txy]-y << endl,0;
        cout << 2 << endl << x <<' ' << y << endl;
}

// C/C++ File
// AUTHOR:   truth-seeker
// FILE:     480B.cpp
// ROLE:     TODO (some explanation)
// CREATED:  2017-01-16 15:24:46
// MODIFIED: 2017-01-16 15:24:46


                                // ALLAH \\
                        who is Hussain? -> whoishussain.org

#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,n,a) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define ALL(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long LL;
typedef pair<int,int> PII;
const int mod=1000000007;
LL powmod(LL a,LL b) {LL res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
int in(){ int x; scanf("%d",&x); return x; }

const int N = 1e5+100;
int n, l, x, y, a[N];
int check(int c, int x = -1){
        int j = 0;
        for(int i = 0;i < n;i ++){
                while(j<n && a[j]-a[i] < c) j++;
                if( a[j] - a[i] == c && x==-1) return a[j];
                if( a[j] - a[i] == c && x!=-1 && (a[j]+x<l||a[i]-x>0) ) return a[j];
        }
        return 0;
}
vector<int> v[4];
int32_t main(){
        ios::sync_with_stdio(false),cin.tie(0);
        cin >> n >> l >> x >> y;
        for(int i = 0;i < n; i++) cin>>a[i];
        int tx = check(x), ty = check(y);
        if( !ty && tx ) return cout << 1 << endl << y,0;
        if( !tx && ty ) return cout << 1 << endl << x,0;
        if( tx ) return cout << 0 << endl,0;
        int txy = check(x+y);
        if( txy!=0 ) return cout << 1 <<endl << txy-x << endl,0;
        txy = check(y-x, x);
        if(!txy) return cout << 2 << endl << x <<' ' << y << endl,0;
        if( txy + x < l ) return cout << 1 << endl << txy+x<<endl,0;
        if( txy - y > 0 ) return cout << 1 << endl << txy-y << endl,0;
        cout << 2 << endl << x <<' ' << y << endl,0;
}

// C/C++ File
// AUTHOR:   truth-seeker
// FILE:     480B.cpp
// ROLE:     TODO (some explanation)
// CREATED:  2017-01-16 15:24:46
// MODIFIED: 2017-01-16 15:24:46


                                // ALLAH \\
                        who is Hussain? -> whoishussain.org

#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,n,a) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define ALL(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long LL;
typedef pair<int,int> PII;
const int mod=1000000007;
LL powmod(LL a,LL b) {LL res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
int in(){ int x; scanf("%d",&x); return x; }

const int N = 1e5+100;
int n, l, x, y, a[N];
int check(int c){
        int j = 0;
        for(int i = 0;i < n;i ++){
                while(j<n && a[j]-a[i] < c) j++;
                if( a[j] - a[i] == c ) return a[j];
        }
        return false;
}
vector<int> v[2];
int32_t main(){
        ios::sync_with_stdio(false),cin.tie(0);
        cin >> n >> l >> x >> y;
        for(int i = 0;i < n; i++) cin>>a[i];
        bool tx = check(x), ty = check(y);
        int txy = check(x+y);
        for(int i = 1;i < n;i ++){
                if( a[i]-x >= 0 ) v[0].push_back(a[i]-x);
                if( a[i]-y >= 0 ) v[1].push_back(a[i]-y);
        }
        sort(ALL(v[0]));
        sort(ALL(v[1]));
        int j = 0;
        rep(i,0,n-1){
                while( j < n-1 && v[0][i] > v[1][j] ) j++;
                if(v[0][i] == v[1][j] ) {txy = v[0][i]+x;break;}
        }
        if( tx != ty ) if( ty ) return cout << 1 << endl << x,0; else return cout << 1 << endl << y,0;
        if( tx ) return cout << 0 << endl,0;
        if( txy!=0 ) return cout << 1 <<endl << txy-x << endl,0;
        cout << 2 << endl << x <<' ' << y << endl;
}

// C/C++ File
// AUTHOR:   truth-seeker
// FILE:     480B.cpp
// ROLE:     TODO (some explanation)
// CREATED:  2017-01-16 15:24:46
// MODIFIED: 2017-01-16 15:24:46


                                // ALLAH \\
                        who is Hussain? -> whoishussain.org

#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,n,a) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define ALL(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long LL;
typedef pair<int,int> PII;
const int mod=1000000007;
LL powmod(LL a,LL b) {LL res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
int in(){ int x; scanf("%d",&x); return x; }

const int N = 1e5+100;
int n, l, x, y, a[N];
int check(int c){
        int j = 0;
        for(int i = 0;i < n;i ++){
                while(j<n && a[j]-a[i] < c) j++;
                if( a[j] - a[i] == c ) return a[j];
        }
        return 0;
}
vector<int> v[4];
int32_t main(){
        ios::sync_with_stdio(false),cin.tie(0);
        cin >> n >> l >> x >> y;
        for(int i = 0;i < n; i++) cin>>a[i];
        int tx = check(x), ty = check(y);
        if( !ty && tx ) return cout << 1 << endl << y,0;
        if( !tx && ty ) return cout << 1 << endl << x,0;
        if( tx ) return cout << 0 << endl,0;
        int txy = check(x+y);
        if( txy!=0 ) return cout << 1 <<endl << txy-x << endl,0;
        txy = check(y-x);
        if( txy + x <= l ) return cout << 1 << endl << txy+x<<endl,0;
        if( txy - y >= 0 ) return cout << 1 << endl << txy-y << endl,0;
        cout << 2 << endl << x <<' ' << y << endl;
}

// C/C++ File
// AUTHOR:   truth-seeker
// FILE:     480B.cpp
// ROLE:     TODO (some explanation)
// CREATED:  2017-01-16 15:24:46
// MODIFIED: 2017-01-16 15:24:46


                                // ALLAH \\
                        who is Hussain? -> whoishussain.org

#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,n,a) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define ALL(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long LL;
typedef pair<int,int> PII;
const int mod=1000000007;
LL powmod(LL a,LL b) {LL res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
int in(){ int x; scanf("%d",&x); return x; }

const int N = 1e5+100;
int n, l, x, y, a[N];
int check(int c){
        int j = 0;
        for(int i = 0;i < n;i ++){
                while(j<n && a[j]-a[i] < c) j++;
                if( a[j] - a[i] == c ) return a[j];
        }
        return 0;
}
vector<int> v[4];
int32_t main(){
        ios::sync_with_stdio(false),cin.tie(0);
        cin >> n >> l >> x >> y;
        for(int i = 0;i < n; i++) cin>>a[i];
        int tx = check(x), ty = check(y);
        if( tx != ty ) if( ty ) return cout << 1 << endl << x,0; else return cout << 1 << endl << y,0;
        if( tx ) return cout << 0 << endl,0;
        int txy = check(x+y);
        if( txy!=0 ) return cout << 1 <<endl << txy-x << endl,0;
        txy = check(y-x);
        if( txy + x <= l ) return cout << 1 << endl << txy+x<<endl,0;
        if( txy - y >= 0 ) return cout << 1 << endl << txy-y << endl,0;
        cout << 2 << endl << x <<' ' << y << endl;
}

// C/C++ File
// AUTHOR:   truth-seeker
// FILE:     480B.cpp
// ROLE:     TODO (some explanation)
// CREATED:  2017-01-16 15:24:46
// MODIFIED: 2017-01-16 15:24:46


                                // ALLAH \\
                        who is Hussain? -> whoishussain.org

#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,n,a) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define ALL(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long LL;
typedef pair<int,int> PII;
const int mod=1000000007;
LL powmod(LL a,LL b) {LL res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
int in(){ int x; scanf("%d",&x); return x; }

const int N = 1e5+100;
int n, l, x, y, a[N];
int check(int c){
        int j = 0;
        for(int i = 0;i < n;i ++){
                while(j<n && a[j]-a[i] < c) j++;
                if( a[j] - a[i] == c ) return a[j];
        }
        return false;
}
vector<int> v[2];
int32_t main(){
        ios::sync_with_stdio(false),cin.tie(0);
        cin >> n >> l >> x >> y;
        for(int i = 0;i < n; i++) cin>>a[i];
        bool tx = check(x), ty = check(y);
        int txy = check(x+y);
        int t1 = 0, t2 = 1;
        for(int i = 1;i < n;i ++){
                if( a[i]-x >= 0 ) v[0 ].push_back(a[i]-x);
                if( a[i]-y >= 0 ) v[1].push_back(a[i]-y);
                if( a[i]+x <= l ) v[2].push_back(a[i]+x);
                if(a[i]+y <= l ) v[3].push_back(a[i]+y);
        }
        rep(s,0,2){ if( s==1 ) t1+=2,t2+=2;
        sort(ALL(v[t1]));
        sort(ALL(v[t2]));
        int j = 0;
        rep(i,0,n-1){
                while( j < n-1 && v[t1][i] > v[t2][j] ) j++;
                if(v[t1][i] == v[t2][j] ) {txy = v[t1][i]+x;break;}
        }
        }
        if( tx != ty ) if( ty ) return cout << 1 << endl << x,0; else return cout << 1 << endl << y,0;
        if( tx ) return cout << 0 << endl,0;
        if( txy!=0 ) return cout << 1 <<endl << txy-x << endl,0;
        cout << 2 << endl << x <<' ' << y << endl;
}

// C/C++ File
// AUTHOR:   truth-seeker
// FILE:     480B.cpp
// ROLE:     TODO (some explanation)
// CREATED:  2017-01-16 15:24:46
// MODIFIED: 2017-01-16 15:24:46


                                // ALLAH \\
                        who is Hussain? -> whoishussain.org

#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,n,a) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define ALL(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long LL;
typedef pair<int,int> PII;
const int mod=1000000007;
LL powmod(LL a,LL b) {LL res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
int in(){ int x; scanf("%d",&x); return x; }

const int N = 1e5+100;
int n, l, x, y, a[N];
int check(int c){
        int j = 0;
        for(int i = 0;i < n;i ++){
                while(j<n && a[j]-a[i] < c) j++;
                if( a[j] - a[i] == c ) return a[j];
        }
        return 0;
}
vector<int> v[4];
int32_t main(){
        ios::sync_with_stdio(false),cin.tie(0);
        cin >> n >> l >> x >> y;
        for(int i = 0;i < n; i++) cin>>a[i];
        int tx = check(x), ty = check(y);
        if( !ty && tx ) return cout << 1 << endl << y,0;
        if( !tx && ty ) return cout << 1 << endl << x,0;
        if( tx ) return cout << 0 << endl,0;
        int txy = check(x+y);
        if( txy!=0 ) return cout << 1 <<endl << txy-x << endl,0;
        txy = check(y-x);
        if(!txy) return cout << 2 << endl << x <<' ' << y << endl,0;
        if( txy + x < l ) return cout << 1 << endl << txy+x<<endl,0;
        if( txy - y > 0 ) return cout << 1 << endl << txy-y << endl,0;
        cout << 2 << endl << x <<' ' << y << endl,0;
}

// C/C++ File
// AUTHOR:   truth-seeker
// FILE:     480B.cpp
// ROLE:     TODO (some explanation)
// CREATED:  2017-01-16 15:24:46
// MODIFIED: 2017-01-16 15:24:46


                                // ALLAH \\
                        who is Hussain? -> whoishussain.org

#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,n,a) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define ALL(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long LL;
typedef pair<int,int> PII;
const int mod=1000000007;
LL powmod(LL a,LL b) {LL res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
int in(){ int x; scanf("%d",&x); return x; }

const int N = 1e5+100;
int n, l, x, y, a[N];
int check(int c){
        int j = 0;
        for(int i = 0;i < n;i ++){
                while(j<n && a[j]-a[i] < c) j++;
                if( a[j] - a[i] == c ) return a[j];
        }
        return false;
}
vector<int> v[4];
int32_t main(){
        ios::sync_with_stdio(false),cin.tie(0);
        cin >> n >> l >> x >> y;
        for(int i = 0;i < n; i++) cin>>a[i];
        bool tx = check(x), ty = check(y);
        int txy = check(x+y);
        int t1 = 0, t2 = 1;
        for(int i = 0;i < n;i ++){
                if( a[i]-x >= 0 ) v[0 ].push_back(a[i]-x);
                if( a[i]-y >= 0 ) v[1].push_back(a[i]-y);
                if( a[i]+x <= l ) v[2].push_back(a[i]+x);
                if(a[i]+y <= l ) v[3].push_back(a[i]+y);
        }
        rep(s,0,2){ if( s==1 ) t1+=2,t2+=2;
        sort(ALL(v[t1]));
        sort(ALL(v[t2]));
        int j = 0;
        rep(i,0,SZ(v[t1])){
                while( j < SZ(v[t2]) && v[t1][i] > v[t2][j] ) j++;
                if(v[t1][i] == v[t2][j] ) {txy = v[t1][i]+x;break;}
        }
        }
        if( tx != ty ) if( ty ) return cout << 1 << endl << x,0; else return cout << 1 << endl << y,0;
        if( tx ) return cout << 0 << endl,0;
        if( txy!=0 ) return cout << 1 <<endl << txy-x << endl,0;
        cout << 2 << endl << x <<' ' << y << endl;
}

// C/C++ File
// AUTHOR:   truth-seeker
// FILE:     480B.cpp
// ROLE:     TODO (some explanation)
// CREATED:  2017-01-16 15:24:46
// MODIFIED: 2017-01-16 15:24:46


                                // ALLAH \\
                        who is Hussain? -> whoishussain.org

#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,n,a) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define ALL(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long LL;
typedef pair<int,int> PII;
const int mod=1000000007;
LL powmod(LL a,LL b) {LL res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
int in(){ int x; scanf("%d",&x); return x; }

const int N = 1e5+100;
int n, l, x, y, a[N];
int check(int c){
        int j = 0;
        for(int i = 0;i < n;i ++){
                while(j<n && a[j]-a[i] < c) j++;
                if( a[j] - a[i] == c ) return a[j];
        }
        return 0;
}
vector<int> v[4];
int32_t main(){
        ios::sync_with_stdio(false),cin.tie(0);
        cin >> n >> l >> x >> y;
        for(int i = 0;i < n; i++) cin>>a[i];
        int tx = check(x), ty = check(y);
        if( !ty && tx ) return cout << 1 << endl << x,0;
        if( !tx && ty ) return cout << 1 << endl << y,0;
        if( tx ) return cout << 0 << endl,0;
        int txy = check(x+y);
        if( txy!=0 ) return cout << 1 <<endl << txy-x << endl,0;
        txy = check(y-x);
        if( txy + x <= l ) return cout << 1 << endl << txy+x<<endl,0;
        if( txy - y >= 0 ) return cout << 1 << endl << txy-y << endl,0;
        cout << 2 << endl << x <<' ' << y << endl;
}

// C/C++ File
// AUTHOR:   truth-seeker
// FILE:     480B.cpp
// ROLE:     TODO (some explanation)
// CREATED:  2017-01-16 15:24:46
// MODIFIED: 2017-01-16 15:24:46


                                // ALLAH \\
                        who is Hussain? -> whoishussain.org

#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,n,a) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define ALL(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long LL;
typedef pair<int,int> PII;
const int mod=1000000007;
LL powmod(LL a,LL b) {LL res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
int in(){ int x; scanf("%d",&x); return x; }

const int N = 1e5+100;
int n, l, x, y, a[N];
int check(int c){
        int j = 0;
        for(int i = 0;i < n;i ++){
                while(j<n && a[j]-a[i] < c) j++;
                if( a[j] - a[i] == c ) return a[j];
        }
        return false;
}
vector<int> v[2];
int32_t main(){
        ios::sync_with_stdio(false),cin.tie(0);
        cin >> n >> l >> x >> y;
        for(int i = 0;i < n; i++) cin>>a[i];
        bool tx = check(x), ty = check(y);
        int txy = check(x+y);
        int t1 = 0, t2 = 1;
        for(int i = 0;i < n;i ++){
                if( a[i]-x >= 0 ) v[0 ].push_back(a[i]-x);
                if( a[i]-y >= 0 ) v[1].push_back(a[i]-y);
                if( a[i]+x <= l ) v[2].push_back(a[i]+x);
                if(a[i]+y <= l ) v[3].push_back(a[i]+y);
        }
        rep(s,0,2){ if( s==1 ) t1+=2,t2+=2;
        sort(ALL(v[t1]));
        sort(ALL(v[t2]));
        int j = 0;
        rep(i,0,SZ(v[t1])){
                while( j < SZ(v[t2]) && v[t1][i] > v[t2][j] ) j++;
                if(v[t1][i] == v[t2][j] ) {txy = v[t1][i]+x;break;}
        }
        }
        if( tx != ty ) if( ty ) return cout << 1 << endl << x,0; else return cout << 1 << endl << y,0;
        if( tx ) return cout << 0 << endl,0;
        if( txy!=0 ) return cout << 1 <<endl << txy-x << endl,0;
        cout << 2 << endl << x <<' ' << y << endl;
}

// C/C++ File
// AUTHOR:   truth-seeker
// FILE:     480B.cpp
// ROLE:     TODO (some explanation)
// CREATED:  2017-01-16 15:24:46
// MODIFIED: 2017-01-16 15:24:46


#include <iostream>
#include <algorithm>
#include <math.h>
#include <string>
#include <cstdio>
#include <vector>
#include <set>
#include <cassert>
#include <cstdlib>
#include <complex>
#include <cctype>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <sstream>
#include <functional>
#include <iomanip>
//#include <windows.h>  //Should be deleted when using AtCoder&POJ
using namespace std;

#define ll long long
#define pq_small priority_queue<int,vector<int>,greater<int> >
/**==Info==
*Program:4
*Problem:Long Jumps
*Date:2017-10-6
*Algorithm:Teacher's Two Pointers
*Stats:Unknown*/
int n,l,x,y,a[100005];

pair<int,int> find_first(int pos){
	int lp=0;
	for(int rp=0;rp<n;rp++){
		while(lp<n && a[lp]+pos<a[rp]) lp++;
		if(a[lp]+pos==a[rp]) return make_pair(a[lp],a[rp]);
	}
	return make_pair(-1,-1);
}

pair<int,int> find_last(int pos){
	int rp=n-1;
	for(int lp=n-1;lp>=0;lp--){
		while(rp>=0 && a[lp]+pos<a[rp]) rp--;
		if(a[lp]+pos==a[rp]) return make_pair(a[lp],a[rp]);
	}
	return make_pair(-1,-1);
}

int main(){
	cin>>n>>l>>x>>y;
	for(int i=0;i<n;i++) cin>>a[i];

	bool findX=(find_first(x)!=make_pair(-1,-1));
	bool findY=(find_first(y)!=make_pair(-1,-1));
	if(findX&&findY){
		cout<<0;
		return 0;
	}
	if(findX){
		cout<<1<<endl<<y;
		return 0;
	}
	if(findY){
		cout<<1<<endl<<x;
		return 0;
	}

	pair<int,int> ans=find_first(x+y);
	if(ans!=make_pair(-1,-1)){
		cout<<1<<endl<<ans.first+x;
		return 0;
	}
	ans=find_first(y-x);
	if(ans!=make_pair(-1,-1) && ans.first+y<l){
		cout<<1<<endl<<ans.first+y;
		return 0;
	}

	ans=find_last(y-x);
	//cout<<ans.first<<" "<<ans.second<<endl;

	if(ans!=make_pair(-1,-1) && ans.first-x>=0){
		cout<<1<<endl<<ans.first-x;
		return 0;
	}
	cout<<2<<endl<<x<<" "<<y<<endl;
	return 0;
}


// Problem : J. Long Jumps
// Contest : Codeforces - CR-2 Binary Search Long Challenge(Practice)
// URL : https://codeforces.com/group/qXv2tukHZE/contest/296034/problem/J
// Memory Limit : 256 MB
// Time Limit : 1000 ms
// Powered by CP Editor (https://github.com/cpeditor/cpeditor)

#include <bits/stdc++.h>
using namespace std;
#define ff         first
#define ss         second
#define endl       '\n'
#define pb         push_back
#define int        long long
#define vi         vector<int>
#define mii        map<int, int>
#define pii        pair<int, int>
#define all(x)     (x).begin(), (x).end()
#define fill(a,b)  memset(a, b, sizeof(a))
#define setbits(x) __builtin_popcountll(x)
#define rep(i,x,y) for(int i=(int)x; i<y; i++)
#define px(a)      for(auto x: a) cout<<x<<" "; cout<<'\n';
#define pxy(a,n)   rep(i,0,n) {px(a[i])};
/*_________________________________________________________*/

const long long MOD=1e9+7,N=1e5+5;
int power(int x, unsigned int y)
{
    int res = 1;
    x = x % MOD;
    if (x == 0) return 0;

    while (y > 0)
    {
        if (y & 1)
            res = (res*x) % MOD;
        y = y>>1;
        x = (x*x) % MOD;
    }
    return res;
}
int solve()
{
	int n,l,x,y,ans=0;
	cin>>n>>l>>x>>y;
	int a[n]; rep(i,0,n) cin>>a[i];
	sort(a,a+n);
	bool ok[2]={0};
	rep(i,0,n){
		if(binary_search(a,a+n,a[i]+x)) ok[0]=1;
		if(binary_search(a,a+n,a[i]+y)) ok[1]=1;
	}
	if(ok[0]&&ok[1]){
		cout<<0<<endl;
		return 0;
	}
	if(ok[0]||ok[1]){
		cout<<1<<endl;
		cout<<(ok[0]?y:x)<<endl;
		return 0;
	}
	rep(i,0,n){
		if(binary_search(a,a+n,a[i]+x-y)){
			if(a[i]+x<=l){
				cout<<1<<endl;
				cout<<a[i]+x<<endl;
				return 0;
			}
			if(a[i]-y>=0){
				cout<<1<<endl;
				cout<<a[i]-y<<endl;
				return 0;
			}
		}
		if(binary_search(a,a+n,a[i]-x-y)){
			if(a[i]-x>=0){
				cout<<1<<endl;
				cout<<a[i]-x<<endl;
				return 0;
			}
			if(a[i]-y>=0){
				cout<<1<<endl;
				cout<<a[i]-y<<endl;
				return 0;
			}
		}
		if(binary_search(a,a+n,a[i]+x+y)){
			if(a[i]+x<=l){
				cout<<1<<endl;
				cout<<a[i]+x<<endl;
				return 0;
			}
			if(a[i]+y<=l){
				cout<<1<<endl;
				cout<<a[i]+y<<endl;
				return 0;
			}
		}
		if(binary_search(a,a+n,a[i]-x+y)){
			if(a[i]-x>=0){
				cout<<1<<endl;
				cout<<a[i]-x<<endl;
				return 0;
			}
			if(a[i]+y<=l){
				cout<<1<<endl;
				cout<<a[i]+y<<endl;
				return 0;
			}
		}
	}
	cout<<2<<endl;
	cout<<x<<" "<<y<<endl;
	return 0;
}
int32_t main()
{
	std::ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	solve();
}


#include <bits/stdc++.h>
using namespace std;

#define FR(i, a, b) for(int i = a; i < b; i++)
#define F first
#define S second
#define PB push_back

typedef long long ll;
typedef pair <int, int> pii;
const int N = 100 * 1000 + 10;
int a[N];
map <int, bool> mp;
int main()
{
	int n, l, x, y;
	cin>> n >> l >> x >> y;
	FR(i, 0, n)
	{
		cin>> a[i];
		mp[a[i]] = true;
	}

	bool chckx = false, chcky = false;
	FR(i, 0, n)
	{
		if(mp.find(a[i] + x) != mp.end())
			chckx = true;
		if(mp.find(a[i] + y) != mp.end())
			chcky = true;
	}

	if(chckx && chcky)
	{
		cout<< 0 << endl;
		return 0;
	}
	if(chcky)
	{
		cout<< 1 << endl;
		cout<< x << endl;
		return 0;
	}
	if(chckx)
	{
		cout<< 1 << endl;
		cout<< y << endl;
		return 0;
	}

	FR(i, 0, n)
	{
		if(mp.find(a[i] + x + y) != mp.end())
		{
			cout<< 1 << endl;
			cout<< a[i] + x << endl;
			return 0;
		}
		if(mp.find(a[i] + y - x) != mp.end() && a[i] + y <= l)
		{
			cout<< 1 << endl;
			cout<< a[i] + y << endl;
			return 0;
		}
		if(mp.find(a[i] - y + x) != mp.end() && a[i] - y >= 0)
		{
			cout<< 1 << endl;
			cout<< a[i] - y << endl;
			return 0;
		}
	}

		cout<< 2 << endl;
		cout<< x << " " << y << endl;
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 100;
int a[N];
int n, l, x, y;
int one;
int okx, oky;
int done;
int ans;

int bs(int l, int t) {
	int low = l, top = n;
	int md;
	while(top > low + 1)
	{
		md = (low + top) / 2;
		if(a[md] >= a[l] + t)
			top = md;
		else
			low = md;
	}
	if(a[top] != a[l]+ t)
		return -1;
	return top;
}

int main() {
	one = okx = oky = done = -1;
	cin >> n >> l >>  x >> y;
	for(int i = 1; i <= n; i++)
		cin >> a[i];
	for(int i = 1; i <= n; i++)
	{
		if(-1 == okx)
			okx = bs(i, x);
		if(-1 == oky)
			oky = bs(i, y);
		if(-1 == one)
		{
			one = bs(i, x + y);
			if(one != -1)
				one = a[i] + x;
		}
		if(-1 == done)
		{
			int tt;
			tt = bs(i, max(x, y) - min(x, y));
			if(tt != -1)
			{
				if(a[i] + max(x, y) <= l)
					done = a[i] + max(x, y);
				else
				if(a[i] - min(x, y) >= 0)
					done = a[i] - min(x, y);
			}
		}
	}
	if(okx > 0 && oky > 0)
	{
		cout << 0;
		return 0;
	}
	else
	if(done > 0)
	{
		cout << 1 << " " << done << endl;
	}
	else
	if(one > 0)
	{
		cout << 1 << endl << one;
	}
	else
	if(okx > 0 && oky < 0)
	{
		cout << 1 << " ";
		cout << y;
	}
	else
	if(oky > 0 && okx < 0)
	{
		cout << 1 << " ";
		cout << x;
	}
	else
		cout << 2 << endl << x << " " << y << endl;\
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 100;
int a[N];
int n, l, x, y;
int one;
int okx, oky;
int ans;

int bs(int l, int t) {
	int low = l, top = n;
	int md;
	while(top > low + 1)
	{
		md = (low + top) / 2;
		if(a[md] >= a[l] + t)
			top = md;
		else
			low = md;
	}
	if(a[top] != a[l]+ t)
		return -1;
	return top;
}

int main() {
	one = okx = oky = -1;
	cin >> n >> l >>  x >> y;
	for(int i = 1; i <= n; i++)
		cin >> a[i];
	for(int i = 1; i <= n; i++)
	{
		if(-1 == okx)
			okx = bs(i, x);
		if(-1 == oky)
			oky = bs(i, y);
		if(-1 == one)
		{
			one = bs(i, x + y);
			if(one != -1)
				one = a[i] + x;
		}
	}
	if(okx > 0 && oky > 0)
	{
		cout << 0;
		return 0;
	}
	else
	if(one > 0)
	{
		cout << 1 << endl << one;
	}
	else
	if(okx > 0 && oky < 0)
	{
		cout << 1 << " ";
		cout << y;
	}
	else
	if(oky > 0 && okx < 0)
	{
		cout << 1 << " ";
		cout << x;
	}
	else
		cout << 2 << endl << x << " " << y << endl;\
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 100;
int a[N];
int n, l, x, y;
int one;
int okx, oky;
int done;
int ans;

int bs(int l, int t) {
	int low = l, top = n;
	int md;
	while(top > low + 1)
	{
		md = (low + top) / 2;
		if(a[md] >= a[l] + t)
			top = md;
		else
			low = md;
	}
	if(a[top] != a[l]+ t)
		return -1;
	return top;
}

int main() {
	one = okx = oky = done = -1;
	cin >> n >> l >>  x >> y;
	for(int i = 1; i <= n; i++)
		cin >> a[i];
	for(int i = 1; i <= n; i++)
	{
		if(-1 == okx)
			okx = bs(i, x);
		if(-1 == oky)
			oky = bs(i, y);
		if(-1 == one)
		{
			one = bs(i, x + y);
			if(one != -1)
				one = a[i] + x;
		}
		if(-1 == done)
		{
			done = bs(i, max(x, y) - min(x, y));
			if(done != -1)
				done = a[i] + max(x, y);
		}
	}
	if(okx > 0 && oky > 0)
	{
		cout << 0;
		return 0;
	}
	else
	if(done > 0)
	{
		cout << 1 << " " << done << endl;
	}
	else
	if(one > 0)
	{
		cout << 1 << endl << one;
	}
	else
	if(okx > 0 && oky < 0)
	{
		cout << 1 << " ";
		cout << y;
	}
	else
	if(oky > 0 && okx < 0)
	{
		cout << 1 << " ";
		cout << x;
	}
	else
		cout << 2 << endl << x << " " << y << endl;\
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 100;
int a[N];
int n, l, x, y;
int one;
int okx, oky;
int done;
int ans;

int bs(int l, int t) {
	int low = l, top = n;
	int md;
	while(top > low + 1)
	{
		md = (low + top) / 2;
		if(a[md] >= a[l] + t)
			top = md;
		else
			low = md;
	}
	if(a[top] != a[l]+ t)
		return -1;
	return top;
}

int main() {
	one = okx = oky = done = -1;
	cin >> n >> l >>  x >> y;
	for(int i = 1; i <= n; i++)
		cin >> a[i];
	for(int i = 1; i <= n; i++)
	{
		if(-1 == okx)
			okx = bs(i, x);
		if(-1 == oky)
			oky = bs(i, y);
		if(-1 == one)
		{
			one = bs(i, x + y);
			if(one != -1)
				one = a[i] + x;
		}
		if(-1 == done)
		{
			int tt;
			tt = bs(i, max(x, y) - min(x, y));
			if(tt != -1)
			{
				if(a[i] + max(x, y) <= n)
					done = a[i] + max(x, y);
				else
				if(a[i] - min(x, y) >= 0)
					done = a[i] - min(x, y);
			}
		}
	}
	if(okx > 0 && oky > 0)
	{
		cout << 0;
		return 0;
	}
	else
	if(done > 0)
	{
		cout << 1 << " " << done << endl;
	}
	else
	if(one > 0)
	{
		cout << 1 << endl << one;
	}
	else
	if(okx > 0 && oky < 0)
	{
		cout << 1 << " ";
		cout << y;
	}
	else
	if(oky > 0 && okx < 0)
	{
		cout << 1 << " ";
		cout << x;
	}
	else
		cout << 2 << endl << x << " " << y << endl;\
	return 0;
}


/*****************
 *   I<3   C++   *
 *  IWANT ANYAC  *
 * ILOVEPROGRAM! *
 *IT'SINTERESTING*
 * ILOVEPROGRAM! *
 *  INCONTESTS   *
 *   GETSCORE    *
 *    ACCODE     *
 *     LETS      *
 *      GO       *
 *Written by:    *
 *    charlieyan *
 *****************/
#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <float.h>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <limits>
#include <locale>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <wchar.h>
#include <wctype.h>
#include <algorithm>
#include <bitset>
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <limits>
#include <map>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <istream>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <utility>
#include <vector>
#include <cwchar>
#include <cwctype>
#include <complex.h>
#include <fenv.h>
#include <inttypes.h>
#include <stdbool.h>
#include <stdint.h>
#include <tgmath.h>
#include <numeric>
#include <list>
#define LL long long
#define pb push_back
#define pob pop_back
#define mp make_pair
#define FILL(a,v) memset((void*)a,v,sizeof(a))
#define FILL0(a) FILL(a,0)
#define FILL1(a) FILL(a,-1)
#define ALL(a) (a).begin(),(a).end()
#define Inf (2147483647-214748+3647)
#define INF ((long long)1e18+(long long)1e17+(long long)1e16)
#define Mod 1000000007
#define foreach(it,x) for(__typeof(x.begin()) it=x.begin();it!=x.end();it++)
#define FOR(i,x) for(int i=0;i<x;i++)
#define RFOR(i,x) for(int i=x-1;i>=0;i--)
#define FFOR(i,a,b) for(int i=a;i<b;i++)
#define FRFOR(i,a,b) for(int i=a-1;i>=b;i--)
#define SZ(a) ((int)(a).size())
#define FI first
#define SE second
#define OVER(a) return puts(a),0
#define fastio ios::sync_with_stdio(0)
#define filei(f) freopen(f,"r",stdin)
#define fileo(f) freopen(f,"w",stdout)
#define eprintf(...) fprintf(stderr,__VA_ARGS__)
#define MASK(a) (1<<(a))
#define MASKX(x,a) ((x)<<(a))
#define BIT(a,b) ((a>>b)&1)
#define cddx(a) priority_queue<a >
#define cxdd(a) priority_queue<a,vector<a >,greater<a > >
#define deval(a) {cerr<<#a<<" = "<<a<<endl;}
#define reg register
using namespace std;
typedef pair<int,int> pii;
typedef unsigned long long UINT;
typedef unsigned int uint;
typedef long long INT;
typedef long double ldouble;
typedef pair<INT,INT> PII;
typedef stringstream sst;
typedef istringstream iss;
typedef vector<int> vint;
typedef vector<INT> VINT;
typedef vector<pii> vpii;
typedef vector<PII> VPII;
typedef priority_queue<int> pqi;
typedef priority_queue<INT> PQI;
typedef priority_queue<pii> pqp;
typedef priority_queue<PII> PQP;
typedef priority_queue<int,vint,greater<int> > xqi;
typedef priority_queue<INT,VINT,greater<INT> > XQI;
typedef priority_queue<pii,vpii,greater<pii> > xqp;
typedef priority_queue<PII,VPII,greater<PII> > XQP;

int n,l,x,y,a[100007],hv1=0,hv2=0,hv3=0,hv4;
set<int> have;

int main()
{
	scanf("%d%d%d%d",&n,&l,&x,&y);
	for(int i=0;i<n;i++)
	{
		scanf("%d",a+i);
		have.insert(a[i]);
	}
	for(int i=0;i<n;i++)
	{
		if(have.count(a[i]+x))
			hv1=1;
		if(have.count(a[i]+y))
			hv2=1;
		if(have.count(a[i]+x-y)&&(a[i]-y>=0||a[i]+x<l))
		{
			hv3=1;
			if(a[i]-y>=0)hv4=a[i]-y;
			else hv4=a[i]+x;
		}
		if(have.count(a[i]-x+y)&&(a[i]-x>=0||a[i]+y<l))
		{
			hv3=1;
			if(a[i]-x>=0)hv4=a[i]-x;
			else hv4=a[i]+y;
		}
		if(x+y==a[i]&&(x<l||y<l))
		{
			hv3=1;
			if(x<l)hv4=x;
			else hv4=y;
		}
		if(have.count(a[i]-x-y)&&(a[i]-x>=0||a[i]-y>=0))
		{
			hv3=1;
			if(a[i]-x>=0)hv4=a[i]-x;
			else hv4=a[i]-y;
		}
	}
	if(hv1&&hv2)OVER("0");
	if(hv1)printf("1\n%d\n",y);
	else if(hv2)printf("1\n%d\n",x);
	else if(hv3)printf("1\n%d\n",hv4);
	else printf("2\n%d %d\n",x,y);
	return 0;
}


#include <bits/stdc++.h>
#define pb push_back
#define pii pair<int, int>

using namespace std;

int n;
int a[100002], x, y, l;

int main()
{
  ios_base::sync_with_stdio(false);
  cin.tie(0); cout.tie(0);
  cin >> n >> l >> x >> y;
  map<int, int>mp;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    mp[a[i]]++;
  }
  bool ok1(0), ok2(0);
  for (int i = 1; i <= n; i++) {
    ok1 |= (mp[a[i] + x] || mp[a[i] - x]);
    ok2 |= (mp[a[i] + y] || mp[a[i] - y]);
  }
  if (2 - ok1 - ok2 == 2) {
    map<int,int>nrx;
    map<int,int>nry;
    for (int i = 1; i <= n; i++) {
      nrx[a[i] + x]++;
      nrx[a[i] - x]++;
      nry[a[i] + y]++;
      nry[a[i] - y]++;
    }
    for (auto it : nrx) {
      if (it.first >= 0 && it.first <= l)
        if (nry[it.first] > 0) {
          cout << "1\n";
          cout << it.first;
          return 0;
        }
    }
    cout << "2\n" << x << " " << y << "\n";
    return 0;
  }
  cout << 2 - ok1 -ok2 << "\n";
  if (!ok1)
    cout << x << " ";
  if (!ok2)
    cout << y << " ";
  return 0;
}


#include <bits/stdc++.h>
#define pb push_back
#define pii pair<int, int>

using namespace std;

int n;
int a[100002], x, y, l;

int main()
{
  ios_base::sync_with_stdio(false);
  cin.tie(0); cout.tie(0);
  cin >> n >> l >> x >> y;
  map<int, int>mp;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    mp[a[i]]++;
  }
  bool ok1(0), ok2(0);
  for (int i = 1; i <= n; i++) {
    ok1 |= (mp[a[i] + x] || mp[a[i] - x]);
    ok2 |= (mp[a[i] + y] || mp[a[i] - y]);
  }
  if (2 - ok1 - ok2 == 2) {
    map<int,int>nrx;
    map<int,int>nry;
    for (int i = 1; i <= n; i++) {
      nrx[a[i] + x]++;
      nrx[a[i] - x]++;
      nry[a[i] + y]++;
      nry[a[i] - y]--;
    }
    for (auto it : nrx) {
      if (it.first >= 0 && it.second <= l)
        if (nry[it.first] > 0) {
          cout << "1\n";
          cout << it.first;
          return 0;
        }
    }
    cout << "2\n" << x << " " << y << "\n";
    return 0;
  }
  cout << 2 - ok1 -ok2 << "\n";
  if (!ok1)
    cout << x << " ";
  if (!ok2)
    cout << y << " ";
  return 0;
}


#include <bits/stdc++.h>
#define pb push_back
#define pii pair<int, int>

using namespace std;

int n;
int a[100002], x, y, l;

int main()
{
  ios_base::sync_with_stdio(false);
  cin.tie(0); cout.tie(0);
  cin >> n >> l >> x >> y;
  map<int, int>mp;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    mp[a[i]]++;
  }
  bool ok1(0), ok2(0);
  for (int i = 1; i <= n; i++) {
    ok1 |= (mp[a[i] + x] || mp[a[i] - x]);
    ok2 |= (mp[a[i] + y] || mp[a[i] - y]);
  }
  cout << 2 - ok1 - ok2 << "\n";
  if (!ok1)
    cout << x << " ";
  if (!ok2)
    cout << y << " ";
  return 0;
}


#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define trav(a, x) for(auto& a : x)
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define sz(x) (int)(x).size()
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;

const int maxn = 100123;
int a[maxn];
unordered_map<ll, bool> vis;

int main() {
#ifdef LOCAL_DEFINE
    freopen("test.in","r",stdin);
#else
    cin.sync_with_stdio(0); cin.tie(0);
#endif
	ll n, l, x, y;
	cin >> n >> l >> x >> y;
	rep(i,0,n) cin >> a[i], vis[a[i]] = true;
	bool flag_x = false, flag_y = false;
	rep(i,1,n){
		if(vis[a[i] - x]) flag_x = true;
		if(vis[a[i] - y]) flag_y = true;
	}
	if(!flag_x && !flag_y){
		rep(i,0,n){
			if(vis[a[i] - x - y]) return cout << "1\n" << a[i] - x << '\n', 0;
			if(vis[a[i] - x + y]) return cout << "1\n" << a[i] - x << '\n', 0;
			if(vis[a[i] + x - y]) return cout << "1\n" << a[i] + x << '\n', 0;
			if(vis[a[i] + x + y]) return cout << "1\n" << a[i] + x << '\n', 0;
		}
		cout << "2\n" << x << " " << y << '\n';
	}
	else if(!flag_x) cout << "1\n" << x << '\n';
	else if(!flag_y) cout << "1\n" << y << '\n';
	else cout << "0\n";

#ifdef LOCAL_DEFINE
    cerr << "Time elapsed: " << 1.0 * (double) clock() / CLOCKS_PER_SEC << " s.\n";
#endif
}


#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define trav(a, x) for(auto& a : x)
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define sz(x) (int)(x).size()
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;

const int maxn = 100123;
int a[maxn];
unordered_map<ll, bool> vis;

int main() {
#ifdef LOCAL_DEFINE
    freopen("test.in","r",stdin);
#else
    cin.sync_with_stdio(0); cin.tie(0);
#endif
	int n, l, x, y;
	cin >> n >> l >> x >> y;
	rep(i,0,n) cin >> a[i], vis[a[i]] = true;
	bool flag_x = false, flag_y = false;
	rep(i,1,n){
		if(vis[a[i] - x]) flag_x = true;
		if(vis[a[i] - y]) flag_y = true;
	}
	if(!flag_x && !flag_y){
		rep(i,0,n){
			if(vis[a[i] - x - y]) return cout << "1\n" << a[i] - x << '\n', 0;
			if(vis[a[i] - x + y]) return cout << "1\n" << a[i] - x << '\n', 0;
			if(vis[a[i] + x - y]) return cout << "1\n" << a[i] + x << '\n', 0;
			if(vis[a[i] + x + y]) return cout << "1\n" << a[i] + x << '\n', 0;
		cout << "2\n" << x << " " << y << '\n';
		}
	}
	else if(!flag_x) cout << "1\n" << x << '\n';
	else if(!flag_y) cout << "1\n" << y << '\n';
	else cout << "0\n";

#ifdef LOCAL_DEFINE
    cerr << "Time elapsed: " << 1.0 * (double) clock() / CLOCKS_PER_SEC << " s.\n";
#endif
}


#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define trav(a, x) for(auto& a : x)
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define sz(x) (int)(x).size()
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;

const int maxn = 100123;
int a[maxn];
unordered_map<ll, bool> vis;

int main() {
#ifdef LOCAL_DEFINE
    freopen("test.in","r",stdin);
#else
    cin.sync_with_stdio(0); cin.tie(0);
#endif
	int n, l, x, y;
	cin >> n >> l >> x >> y;
	rep(i,0,n) cin >> a[i], vis[a[i]] = true;
	bool flag_x = false, flag_y = false;
	rep(i,1,n){
		if(vis[a[i] - x]) flag_x = true;
		if(vis[a[i] - y]) flag_y = true;
	}
	if(!flag_x && !flag_y){
		rep(i,0,n){
			if(vis[a[i] - x - y] && a[i] >= x) return cout << "1\n" << a[i] - x << '\n', 0;
			if(vis[a[i] - x + y] && a[i] >= x) return cout << "1\n" << a[i] - x << '\n', 0;
			if(vis[a[i] + x - y] && a[i] <= l - x) return cout << "1\n" << a[i] + x << '\n', 0;
			if(vis[a[i] + x + y] && a[i] <= l - x) return cout << "1\n" << a[i] + x << '\n', 0;
		}
		cout << "2\n" << x << " " << y << '\n';
	}
	else if(!flag_x) cout << "1\n" << x << '\n';
	else if(!flag_y) cout << "1\n" << y << '\n';
	else cout << "0\n";

#ifdef LOCAL_DEFINE
    cerr << "Time elapsed: " << 1.0 * (double) clock() / CLOCKS_PER_SEC << " s.\n";
#endif
}


#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define trav(a, x) for(auto& a : x)
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define sz(x) (int)(x).size()
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;

const int maxn = 100123;
int a[maxn];
unordered_map<ll, bool> vis;

int main() {
#ifdef LOCAL_DEFINE
    freopen("test.in","r",stdin);
#else
    cin.sync_with_stdio(0); cin.tie(0);
#endif
	int n, l, x, y;
	cin >> n >> l >> x >> y;
	rep(i,0,n) cin >> a[i], vis[a[i]] = true;
	bool flag_x = false, flag_y = false;
	rep(i,1,n){
		if(vis[a[i] - x]) flag_x = true;
		if(vis[a[i] - y]) flag_y = true;
	}
	if(!flag_x && !flag_y){
		rep(i,0,n){
			if(vis[a[i] - x - y]) return cout << "1\n" << a[i] - x << '\n', 0;
			if(vis[a[i] - x + y]) return cout << "1\n" << a[i] - x << '\n', 0;
			if(vis[a[i] + x - y]) return cout << "1\n" << a[i] + x << '\n', 0;
			if(vis[a[i] + x + y]) return cout << "1\n" << a[i] + x << '\n', 0;
		}
		cout << "2\n" << x << " " << y << '\n';
	}
	else if(!flag_x) cout << "1\n" << x << '\n';
	else if(!flag_y) cout << "1\n" << y << '\n';
	else cout << "0\n";

#ifdef LOCAL_DEFINE
    cerr << "Time elapsed: " << 1.0 * (double) clock() / CLOCKS_PER_SEC << " s.\n";
#endif
}


#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
typedef long long ll;
using namespace __gnu_pbds;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pbds;
#pragma GCC target ("avx2")
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
#define ios ios_base::sync_with_stdio(0) ; cin.tie(0) ; cout.tie(0)
#define so sizeof
#define pb push_back
#define cl clear() ;
#define vl vector<ll>
#define sz size()
#define len length()
#define emp empty()
#define el endl;cout.flush()
#define be begin()
#define fi first
#define se second
#define br break
#define en end()
#define ro return 0
#define eb emplace_back
#define con continue
#define ms(x) memset(x , 0ll, so x)
#define all(x) (x).be , (x).en
#define acc(x) accumulate((x).be , (x).en , 0ll)
#define forn(i,a,b) for(ll i=a;i<=b;++i)
#define rng_58 mt19937 rng(chrono::steady_clock::now().time_since_epoch().count())
#define vll vector<pair<ll,ll> >
#define vlll vector<ll,pair<ll,ll>>
#define vlvl vector<pair<ll,ll>,ll>>
#define pll pair<ll,ll>
#define plll pair<ll,pair<ll,ll>>
#define plvl pair<pair<ll,ll> ,ll>
#define mp make_pair
#define trace3(a,b,c) cerr <<"a is " << a << " b is " << b << " c is " << c << el;
#define trace4(a,b,c,d) cerr <<"a is " << a << " b is " << b << " c is " << c <<" d is " << d << el ;
#define trace5(a,b,c,d,e) cerr <<"a is " << a << " b is " << b << " c is " << c <<" d is " << d << " e is " << e << el;
#define trace6(a,b,c,d,e,f) cerr <<"a is " << a << " b is " << b << " c is " << c <<" d is " << d << " e is " << e << " f is " << f << el ;

int main()
{
    ios;
    ll n , l , x , y;
    cin >> n >> l >> x >> y;
    vl v;
    unordered_map<ll,ll> mpp ;
    forn(i , 1 , n ){
       ll x;
       cin >> x ;
       mpp[x] = 1;
       v.pb(x);
    }
    sort(all(v)) ;
    ll p1 = 0 , p2 = 0 ;
    bool found1 = false ;
    while(1){
        if(p1 >= n or p2 >= n) br ;
        ll diff = v[p2] - v[p1] ;
        if(diff < y) ++p2 ;
        if(diff == y){
            found1 = true;
            br;
        }
        if(diff > y) ++p1;
    }
    bool found2 = false;
    p1 = 0 ;  p2 = 0 ;
    while(1){
        if(p1 >= n or p2 >= n) br ;
        ll diff = v[p2] - v[p1] ;
        if(diff < x) ++p2;
        if(diff == x){
            found2 = true;
            br ;
        }
        if(diff > x) ++p1 ;
    }
    if(found1  == true and found2 == true){
        cout << 0 << el ;
        ro ;
    }
    else if(found1 == true and found2 == false){
        cout << 1 << el ;
        cout <<x << el;
        ro ;
    }
    else if(found1 == false and found2 == true){
        cout << 1 << el ;
        cout << y << el ;

        ro ;
    }
    else if(found1 == false and found2 == false){
        ll maxx = 2 ;
        ll where =INT_MAX;
        forn(i , 0 , n - 1 ){
            /// go for x
            ll curr = v[i] ;
            ll addleft = curr - x;
            ll addright = curr + x;
            ll toleft = INT_MAX;
            ll toright = INT_MAX;
            if(addleft >= 0 and addleft <= l){
                toleft = addleft - y ;
                toright = addleft + y ;
                if(mpp[toleft] == 1 or mpp[toright] == 1){
                    maxx = 1 ;
                    where = addleft ;
                    br ;
                }
            }
            toleft = INT_MAX;
            toright = INT_MAX;
            if(addright >= 0 and addright <= l){
                toleft = addright - y ;
                toright = addright + y ;
                if(mpp[toleft] == 1 or mpp[toright] == 1){
                    maxx = 1;
                    where = addright ;
                    br ;
                }
            }
        }
        if(maxx == 2){
            /// go for y
            forn(i , 0 , n - 1 ){
               ll curr = v[i] ;
               ll addleft = curr - y ;
               ll addright = curr + y ;
               ll toleft = INT_MAX;
               ll toright = INT_MAX;
               if(addleft >= 0 and addleft <= l){
                 toleft = addleft - x;
                 toright = addleft + x ;
                 if(mpp[toleft] == 1 or mpp[toright] == 1){
                    maxx = 1 ;
                    where = addleft ;
                    br ;
                 }
               }
               toleft = INT_MAX;
               toright = INT_MAX;
               if(addright >=0 and addright <= l){
                toleft = addright - x;
                toright = addright + x;
                if(mpp[toleft] == 1 or mpp[toright] == 1){
                    maxx = 1 ;
                    where = addright ;
                    br ;
                }
               }
            }
        }
        if(maxx == 2){
            cout << maxx << el;
            cout << x << " " << y << el ;
            ro ;
        }
        else if(maxx == 1){
            cout << maxx << el ;
            cout << where << el ;
            ro ;
        }
    }
    ro ;
}


#include<bits/stdc++.h>
#define NN 200200
using namespace std;
typedef long long INT;
typedef vector<int> VI;
typedef pair<int, int> pii;
int a[NN];
int main(){
#ifndef ONLINE_JUDGE
	freopen("in.in","r",stdin);
	freopen("out.out","w",stdout);
#endif
	int n,l,x,y;
	scanf("%d%d%d%d",&n,&l,&x,&y);
	for(int i=1;i<=n;i++) scanf("%d",a+i);
	int ans=2;
	int g=0,f=0;
	if(x==l) g=1;
	if(g==0) for(int i=1;i<=n;i++){
		if(a[i]>=x) {
			int t=a[i]-x;
			int r=lower_bound(a+1,a+n+1,t)-a;
			if(a[r]==t) {g=1;break;}
		}
	}
	if(g==0) for(int i=1;i<=n;i++){
		int t=a[i]+x;
		int r=lower_bound(a+1,a+n+1,t)-a;
		if(a[r]==t) {g=1;break;}
	}
	if(y==l) f=1;
	if(f==0) for(int i=1;i<=n;i++){
		if(a[i]>=x) {
			int t=a[i]-y;
			int r=lower_bound(a+1,a+n+1,t)-a;
			if(a[r]==t) {f=1;break;}
		}
	}
	if(f==0) for(int i=1;i<=n;i++){
		int t=a[i]+y;
		int r=lower_bound(a+1,a+n+1,t)-a;
		if(a[r]==t) {f=1;break;}
	}
	if(f==0 and g==0){
		int gg=0;
		for(int i=1;i<=n;i++){
			int t=x+y;
			int r=lower_bound(a+1,a+n+1,t)-a;
			if(a[r]==t) {gg=1;break;}
		}
		if(gg==0) for(int i=1;i<=n;i++){
			int t=abs(x-y);
			int r=lower_bound(a+1,a+n+1,t)-a;
			if(a[r]==t) {gg=2;break;}
		}
		if(gg){
			cout<<1<<endl;
			cout<<max(x,y)<<endl;
			return 0;
		}
		else {
			cout<<2<<endl;
			cout<<x<<" "<<y<<endl;
			return 0;
		}
	}
	if(g) ans--;
	if(f) ans--;
	cout<<ans<<endl;
	if(g==0) cout<<x<<endl;
	else if(f==0) cout<<y<<endl;
	return 0;
}


#include<bits/stdc++.h>
#define NN 200200
using namespace std;
typedef long long INT;
typedef vector<int> VI;
typedef pair<int, int> pii;
int a[NN];
int main(){
#ifndef ONLINE_JUDGE
	freopen("in.in","r",stdin);
	freopen("out.out","w",stdout);
#endif
	int n,l,x,y;
	scanf("%d%d%d%d",&n,&l,&x,&y);
	for(int i=1;i<=n;i++) scanf("%d",a+i);
	int ans=2;
	int g=0,f=0;
	if(x==l) g=1;
	if(g==0) for(int i=1;i<=n;i++){
		if(a[i]>=x) {
			int t=a[i]-x;
			int r=lower_bound(a+1,a+n+1,t)-a;
			if(a[r]==t) {g=1;break;}
		}
	}
	if(g==0) for(int i=1;i<=n;i++){
		int t=a[i]+x;
		int r=lower_bound(a+1,a+n+1,t)-a;
		if(a[r]==t) {g=1;break;}
	}
	if(y==l) f=1;
	if(f==0) for(int i=1;i<=n;i++){
		if(a[i]>=x) {
			int t=a[i]-y;
			int r=lower_bound(a+1,a+n+1,t)-a;
			if(a[r]==t) {f=1;break;}
		}
	}
	if(f==0) for(int i=1;i<=n;i++){
		int t=a[i]+y;
		int r=lower_bound(a+1,a+n+1,t)-a;
		if(a[r]==t) {f=1;break;}
	}
	int gg=0;
	if(f==0 and g==0){
		for(int i=1;i<=n;i++){
			int t=x+y;
			int r=lower_bound(a+1,a+n+1,t)-a;
			if(a[r]==t) {gg=1;break;}
		}
		if(gg==0) for(int i=1;i<=n;i++){
			int t=abs(x-y);
			int r=lower_bound(a+1,a+n+1,t)-a;
			if(a[r]==t) {gg=2;break;}
		}
	}
	if(gg){
		cout<<1<<endl;
		cout<<max(x,y)<<endl;
		return 0;
	}
	if(g) ans--;
	if(f) ans--;
	cout<<ans<<endl;
	if(ans==0) return 0;
	if(g==0 and f==1) cout<<x;
	else if(f==0 and g==1) cout<<y;
	else cout<<x<<" "<<y<<endl;
	return 0;
}


#include<bits/stdc++.h>
#define NN 200200
using namespace std;
int a[NN];
int main(){
#ifndef ONLINE_JUDGE
	freopen("in.in","r",stdin);
	freopen("out.out","w",stdout);
#endif
	int n,l,x,y;
	scanf("%d%d%d%d",&n,&l,&x,&y);
	for(int i=1;i<=n;i++) scanf("%d",a+i);
	int ans=2;
	int g=0,f=0;
	if(x==l) g=1;
	if(g==0) for(int i=1;i<=n;i++){
		int t1=a[i]-x;
		int t2=a[i]+x
		int r1=lower_bound(a+1,a+n+1,t1)-a;
		int r2=lower_bound(a+1,a+n+1,t2)-a;
		if(a[r1]==t1) {g=1;break;}
		if(a[r2]==t2) {g=1;break;}
	}
	if(y==l) f=1;
	if(f==0) for(int i=1;i<=n;i++){
		int t1=a[i]-y;
		int t2=a[i]+y;
		int r1=lower_bound(a+1,a+n+1,t1)-a;
		int r2=lower_bound(a+1,a+n+1,t2)-a;
		if(a[r1]==t1) {f=1;break;}
		if(a[r2]==t2) {f=1;break;}
	}
	if(f==0 and g==0){
		int gg=0;
		for(int i=1;i<=n;i++){
			int t1=a[i]+x+y;
			int t2=a[i]+y-x;
			int t3=a[i]-y+x;
			int r1=lower_bound(a+1,a+n+1,t1)-a;
			int r2=lower_bound(a+1,a+n+1,t2)-a;
			int r3=lower_bound(a+1,a+n+1,t3)-a;
			if(a[r1]==t1) {gg=a[i]+y;break;}
			if(a[r2]==t2) {gg=a[i]+y;break;}
			if(a[r3]==t3) {gg=a[i]+x;break;}
		}
		if(gg){
			cout<<1<<endl;
			cout<<gg<<endl;
			return 0;
		}
		else {
			cout<<2<<endl;
			cout<<x<<" "<<y<<endl;
			return 0;
		}
	}
	ans-=f+g;
	cout<<ans<<endl;
	if(g==0) cout<<x<<endl;
	else if(f==0) cout<<y<<endl;
	return 0;
}


#include<bits/stdc++.h>
#define NN 200200
using namespace std;
int a[NN];
int main(){
#ifndef ONLINE_JUDGE
	freopen("in.in","r",stdin);
	freopen("out.out","w",stdout);
#endif
	int n,l,x,y;
	scanf("%d%d%d%d",&n,&l,&x,&y);
	for(int i=1;i<=n;i++) scanf("%d",a+i);
	int ans=2;
	int g=0,f=0;
	if(x==l) g=1;
	if(g==0) for(int i=1;i<=n;i++){
		int t1=a[i]-x;
		int t2=a[i]+x;
		int r1=lower_bound(a+1,a+n+1,t1)-a;
		int r2=lower_bound(a+1,a+n+1,t2)-a;
		if(a[r1]==t1) {g=1;break;}
		if(a[r2]==t2) {g=1;break;}
	}
	if(y==l) f=1;
	if(f==0) for(int i=1;i<=n;i++){
		int t1=a[i]-y;
		int t2=a[i]+y;
		int r1=lower_bound(a+1,a+n+1,t1)-a;
		int r2=lower_bound(a+1,a+n+1,t2)-a;
		if(a[r1]==t1) {f=1;break;}
		if(a[r2]==t2) {f=1;break;}
	}
	if(f==0 and g==0){
		int gg=0;
		for(int i=1;i<=n;i++){
			int t1=a[i]+x+y;
			int t2=a[i]+y-x;
			int r1=lower_bound(a+1,a+n+1,t1)-a;
			int r2=lower_bound(a+1,a+n+1,t2)-a;
			if(a[r1]==t1) {gg=a[i]+x;break;}
			if(a[r2]==t2) {
				if(a[i]-x>0) gg=a[i]-x;
				else if(a[i]+y<l) gg=a[i]+y;
				else continue;
				break;
			}
		}
		if(gg){
			cout<<1<<endl;
			cout<<gg<<endl;
			return 0;
		}
		else {
			cout<<2<<endl;
			cout<<x<<" "<<y<<endl;
			return 0;
		}
	}
	ans-=f+g;
	cout<<ans<<endl;
	if(g==0) cout<<x<<endl;
	if(f==0) cout<<y<<endl;
	return 0;
}


#include<bits/stdc++.h>
#define NN 200200
using namespace std;
typedef long long INT;
typedef vector<int> VI;
typedef pair<int, int> pii;
int a[NN];
int main(){
#ifndef ONLINE_JUDGE
	freopen("in.in","r",stdin);
	freopen("out.out","w",stdout);
#endif
	int n,l,x,y;
	scanf("%d%d%d%d",&n,&l,&x,&y);
	for(int i=1;i<=n;i++) scanf("%d",a+i);
	int ans=2;
	int g=0,f=0;
	if(x==l) g=1;
	if(g==0) for(int i=1;i<=n;i++){
		if(a[i]>=x) {
			int t=a[i]-x;
			int r=lower_bound(a+1,a+n+1,t)-a;
			if(a[r]==t) {g=1;break;}
		}
	}
	if(g==0) for(int i=1;i<=n;i++){
		int t=a[i]+x;
		int r=lower_bound(a+1,a+n+1,t)-a;
		if(a[r]==t) {g=1;break;}
	}
	if(y==l) f=1;
	if(f==0) for(int i=1;i<=n;i++){
		if(a[i]>=x) {
			int t=a[i]-y;
			int r=lower_bound(a+1,a+n+1,t)-a;
			if(a[r]==t) {f=1;break;}
		}
	}
	if(f==0) for(int i=1;i<=n;i++){
		int t=a[i]+y;
		int r=lower_bound(a+1,a+n+1,t)-a;
		if(a[r]==t) {f=1;break;}
	}
	int gg=0;
	if(f==0 and g==0){
		for(int i=1;i<=n;i++){
			int t=x+y;
			int r=lower_bound(a+1,a+n+1,t)-a;
			if(a[r]==t) {gg=1;break;}
		}
		if(gg==0) for(int i=1;i<=n;i++){
			int t=abs(x-y);
			int r=lower_bound(a+1,a+n+1,t)-a;
			if(a[r]==t) {gg=2;break;}
		}
		if(gg){
			cout<<1<<endl;
			cout<<max(x,y)<<endl;
			return 0;
		}
	}
	if(g) ans--;
	if(f) ans--;
	cout<<ans<<endl;
	if(ans==0) return 0;
	if(g==0 and f==1) cout<<x;
	else if(f==0 and g==1) cout<<y;
	else cout<<x<<" "<<y<<endl;
	return 0;
}


#include<bits/stdc++.h>
#define NN 200200
using namespace std;
typedef long long INT;
typedef vector<int> VI;
typedef pair<int, int> pii;
int a[NN];
int main(){
#ifndef ONLINE_JUDGE
	freopen("in.in","r",stdin);
	freopen("out.out","w",stdout);
#endif
	int n,l,x,y;
	scanf("%d%d%d%d",&n,&l,&x,&y);
	for(int i=1;i<=n;i++) scanf("%d",a+i);
	int ans=2;
	int g=0,f=0;
	if(x==l) g=1;
	if(g==0) for(int i=1;i<=n;i++){
		if(a[i]>=x) {
			int t=a[i]-x;
			int r=lower_bound(a+1,a+n+1,t)-a;
			if(a[r]==t) {g=1;break;}
		}
	}
	if(g==0) for(int i=1;i<=n;i++){
		int t=a[i]+x;
		int r=lower_bound(a+1,a+n+1,t)-a;
		if(a[r]==t) {g=1;break;}
	}
	if(y==l) f=1;
	if(f==0) for(int i=1;i<=n;i++){
		if(a[i]>=x) {
			int t=a[i]-y;
			int r=lower_bound(a+1,a+n+1,t)-a;
			if(a[r]==t) {f=1;break;}
		}
	}
	if(f==0) for(int i=1;i<=n;i++){
		int t=a[i]+y;
		int r=lower_bound(a+1,a+n+1,t)-a;
		if(a[r]==t) {f=1;break;}
	}
	if(g) ans--;
	if(f) ans--;
	cout<<ans<<endl;
	if(ans==0) return 0;
	if(g==0 and f==1) cout<<x;
	else if(f==0 and g==1) cout<<y;
	else cout<<x<<" "<<y<<endl;
	return 0;
}


#include<bits/stdc++.h>
#define NN 200200
using namespace std;
int a[NN];
int main(){
#ifndef ONLINE_JUDGE
	freopen("in.in","r",stdin);
	freopen("out.out","w",stdout);
#endif
	int n,l,x,y;
	scanf("%d%d%d%d",&n,&l,&x,&y);
	for(int i=1;i<=n;i++) scanf("%d",a+i);
	int ans=2;
	int g=0,f=0;
	if(x==l) g=1;
	if(g==0) for(int i=1;i<=n;i++){
		int t1=a[i]-x;
		int t2=a[i]+x;
		int r1=lower_bound(a+1,a+n+1,t1)-a;
		int r2=lower_bound(a+1,a+n+1,t2)-a;
		if(a[r1]==t1) {g=1;break;}
		if(a[r2]==t2) {g=1;break;}
	}
	if(y==l) f=1;
	if(f==0) for(int i=1;i<=n;i++){
		int t1=a[i]-y;
		int t2=a[i]+y;
		int r1=lower_bound(a+1,a+n+1,t1)-a;
		int r2=lower_bound(a+1,a+n+1,t2)-a;
		if(a[r1]==t1) {f=1;break;}
		if(a[r2]==t2) {f=1;break;}
	}
	if(f==0 and g==0){
		int gg=0;
		for(int i=1;i<=n;i++){
			int t1=a[i]+x+y;
			int t2=a[i]+y-x;
			int t3=a[i]-y+x;
			int r1=lower_bound(a+1,a+n+1,t1)-a;
			int r2=lower_bound(a+1,a+n+1,t2)-a;
			int r3=lower_bound(a+1,a+n+1,t3)-a;
			if(a[r1]==t1) {gg=a[i]+y;break;}
			if(a[r2]==t2) {gg=a[i]+y;break;}
			if(a[r3]==t3) {gg=a[i]+x;break;}
		}
		if(gg){
			cout<<1<<endl;
			cout<<gg<<endl;
			return 0;
		}
		else {
			cout<<2<<endl;
			cout<<x<<" "<<y<<endl;
			return 0;
		}
	}
	ans-=f+g;
	cout<<ans<<endl;
	if(g==0) cout<<x<<endl;
	else if(f==0) cout<<y<<endl;
	return 0;
}


#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<bits/stdc++.h>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<bitset>
// #include < unordered_map >
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
// #include "boost/algorithm/string.hpp"
#define fio ios_base::sync_with_stdio(false)
#define mod 1000000007
#define mod1 mod
#define mod2 100000009
#define li long long int
#define ll li
#define readi(x) scanf("%d",&x)
#define  reads(x)  scanf("%s", x)
#define readl(x) scanf("%I64d",&x)
#define rep(i,n) for(i=0;i<n;i++)
#define revp(i,n) for(i=(n-1);i>=0;i--)
#define myrep1(i,a,b) for(i=a;i<=b;i++)
#define myrep2(i,a,b) for(i=b;i>=a;i--)
#define pb push_back
#define mp make_pair
#define fi first
#define sec second
#define MAXN 1000000000000000000
#define MINN -1000000000000000000
#define pii pair<ll,ll>
#define pdd pair<double,double>
#define pic pair<int,char>
#define N 500550
#define lgn 20
#define ddouble long double
#define minus minu
#define PI 3.1415926535
#define lgn 20

// #define INTMAX 200000000

// using namespace boost;
// #define si short int

using namespace std;
using namespace __gnu_pbds;
typedef priority_queue<pii, vector<pii> > max_pq;
typedef priority_queue<pii, vector<pii> , greater<pii >  > min_pq;
ll toint(const string &s) {stringstream ss; ss << s; ll x; ss >> x; return x;}
string tostring ( ll number ){stringstream ss; ss<< number; return ss.str();}

// typedef priority_queue<pair < ll , pair < pii , ll > >  , vector<pair < ll , pair < pii , ll > >  > ,greater<pair < ll , pair < pii , ll > >  > > min_pq;

typedef tree< ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update > OST;
typedef priority_queue< char , vector<char> > max_pqc;
// typedef priority_queue<ll, vector<ll > , greater < ll >  > min_pq;

ll n,l,x,y;
ll ar[ N ];
map < ll , ll > mark;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    #ifndef ONLINE_JUDGE
        freopen("input.txt","r",stdin);
        freopen("output.txt","w",stdout);
    #endif
    cin >> n >> l >> x >> y;
    for ( ll i = 1; i <= n; i ++)
    {
        cin >> ar[i];
    }
    mark[0] = 1;
    ll pos = 0,pos2 = 0;
    bool xy = 0,xx = 0,yy = 0,xy2 = 0;
    for ( ll i = 2; i <= n ;  i++)
    {
        if ( mark[ar[i]-x] )
            xx = 1;
        if ( mark[ar[i]-y])
            yy = 1;
        if ( mark[ar[i]-x-y])
        {
            pos = ar[i];
            xy = 1;
        }
        if ( mark[ar[i]-y+x] )
        {
            pos2 = ar[i];
            xy2 = 1;
        }
        mark[ar[i]]=1;
    }
    if ( xx and yy )
        cout <<"0";
    else if ( xx )
    {
        cout <<"1\n";
        cout <<y;
    }
    else if ( yy )
    {
        cout <<"1\n";
        cout <<x;
    }
    else
    {
        if ( xy )
        {
            cout <<"1\n";
            cout << (pos-x);
        }
        else if ( xy2 )
        {
            cout <<"1\n";
            cout << (pos+x);
        }
        else
        {
            cout <<"2\n";
            cout << x <<" " << y ;
        }
    }

}


#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<bits/stdc++.h>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<bitset>
// #include < unordered_map >
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
// #include "boost/algorithm/string.hpp"
#define fio ios_base::sync_with_stdio(false)
#define mod 1000000007
#define mod1 mod
#define mod2 100000009
#define li long long int
#define ll li
#define readi(x) scanf("%d",&x)
#define  reads(x)  scanf("%s", x)
#define readl(x) scanf("%I64d",&x)
#define rep(i,n) for(i=0;i<n;i++)
#define revp(i,n) for(i=(n-1);i>=0;i--)
#define myrep1(i,a,b) for(i=a;i<=b;i++)
#define myrep2(i,a,b) for(i=b;i>=a;i--)
#define pb push_back
#define mp make_pair
#define fi first
#define sec second
#define MAXN 1000000000000000000
#define MINN -1000000000000000000
#define pii pair<ll,ll>
#define pdd pair<double,double>
#define pic pair<int,char>
#define N 500550
#define lgn 20
#define ddouble long double
#define minus minu
#define PI 3.1415926535
#define lgn 20

// #define INTMAX 200000000

// using namespace boost;
// #define si short int

using namespace std;
using namespace __gnu_pbds;
typedef priority_queue<pii, vector<pii> > max_pq;
typedef priority_queue<pii, vector<pii> , greater<pii >  > min_pq;
ll toint(const string &s) {stringstream ss; ss << s; ll x; ss >> x; return x;}
string tostring ( ll number ){stringstream ss; ss<< number; return ss.str();}

// typedef priority_queue<pair < ll , pair < pii , ll > >  , vector<pair < ll , pair < pii , ll > >  > ,greater<pair < ll , pair < pii , ll > >  > > min_pq;

typedef tree< ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update > OST;
typedef priority_queue< char , vector<char> > max_pqc;
// typedef priority_queue<ll, vector<ll > , greater < ll >  > min_pq;

ll n,l,x,y;
ll ar[ N ];
map < ll , ll > mark;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    #ifndef ONLINE_JUDGE
        freopen("input.txt","r",stdin);
        freopen("output.txt","w",stdout);
    #endif
    cin >> n >> l >> x >> y;
    for ( ll i = 1; i <= n; i ++)
    {
        cin >> ar[i];
    }
    mark[0] = 1;
    ll pos = 0,pos2 = 0;
    bool xy = 0,xx = 0,yy = 0,xy2;
    for ( ll i = 2; i <= n ;  i++)
    {
        if ( mark[ar[i]-x] )
            xx = 1;
        if ( mark[ar[i]-y])
            yy = 1;
        if ( mark[ar[i]-x-y])
        {
            pos = ar[i];
            xy = 1;
        }
        if ( mark[ar[i]-y+x] )
        {
            pos2 = ar[i];
            xy2 = 1;
        }
        mark[ar[i]]=1;
    }
    if ( xx and yy )
        cout <<"0";
    else if ( xx )
    {
        cout <<"1\n";
        cout <<y;
    }
    else if ( yy )
    {
        cout <<"1\n";
        cout <<x;
    }
    else
    {
        if ( xy )
        {
            cout <<"1\n";
            cout << (pos-x);
        }
        else if ( xy2 )
        {
            cout <<"1\n";
            cout << (pos2+x);
        }
        else
        {
            cout <<"2\n";
            cout << x <<" " << y ;
        }
    }

}


#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<bits/stdc++.h>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<bitset>
// #include < unordered_map >
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
// #include "boost/algorithm/string.hpp"
#define fio ios_base::sync_with_stdio(false)
#define mod 1000000007
#define mod1 mod
#define mod2 100000009
#define li long long int
#define ll li
#define readi(x) scanf("%d",&x)
#define  reads(x)  scanf("%s", x)
#define readl(x) scanf("%I64d",&x)
#define rep(i,n) for(i=0;i<n;i++)
#define revp(i,n) for(i=(n-1);i>=0;i--)
#define myrep1(i,a,b) for(i=a;i<=b;i++)
#define myrep2(i,a,b) for(i=b;i>=a;i--)
#define pb push_back
#define mp make_pair
#define fi first
#define sec second
#define MAXN 1000000000000000000
#define MINN -1000000000000000000
#define pii pair<ll,ll>
#define pdd pair<double,double>
#define pic pair<int,char>
#define N 500550
#define lgn 20
#define ddouble long double
#define minus minu
#define PI 3.1415926535
#define lgn 20

// #define INTMAX 200000000

// using namespace boost;
// #define si short int

using namespace std;
using namespace __gnu_pbds;
typedef priority_queue<pii, vector<pii> > max_pq;
typedef priority_queue<pii, vector<pii> , greater<pii >  > min_pq;
ll toint(const string &s) {stringstream ss; ss << s; ll x; ss >> x; return x;}
string tostring ( ll number ){stringstream ss; ss<< number; return ss.str();}

// typedef priority_queue<pair < ll , pair < pii , ll > >  , vector<pair < ll , pair < pii , ll > >  > ,greater<pair < ll , pair < pii , ll > >  > > min_pq;

typedef tree< ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update > OST;
typedef priority_queue< char , vector<char> > max_pqc;
// typedef priority_queue<ll, vector<ll > , greater < ll >  > min_pq;

ll n,l,x,y;
ll ar[ N ];
map < ll , ll > mark;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    #ifndef ONLINE_JUDGE
        freopen("input.txt","r",stdin);
        freopen("output.txt","w",stdout);
    #endif
    cin >> n >> l >> x >> y;
    for ( ll i = 1; i <= n; i ++)
    {
        cin >> ar[i];
    }
    mark[0] = 1;
    ll pos = 0;
    bool xy = 0,xx = 0,yy = 0;
    for ( ll i = 2; i <= n ;  i++)
    {
        if ( mark[ar[i]-x] )
            xx = 1;
        if ( mark[ar[i]-y])
            yy = 1;
        if ( mark[ar[i]-x-y])
        {
            pos = ar[i];
            xy = 1;
        }
        mark[ar[i]]=1;
    }
    if ( xx and yy )
        cout <<"0";
    else if ( xx )
    {
        cout <<"1\n";
        cout <<y;
    }
    else if ( yy )
    {
        cout <<"1\n";
        cout <<x;
    }
    else
    {
        if ( xy )
        {
            cout <<"1\n";
            cout << (pos-x);
        }
        else
        {
            cout <<"2\n";
            cout << x <<" " << y ;
        }
    }

}


#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<bits/stdc++.h>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<bitset>
// #include < unordered_map >
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
// #include "boost/algorithm/string.hpp"
#define fio ios_base::sync_with_stdio(false)
#define mod 1000000007
#define mod1 mod
#define mod2 100000009
#define li long long int
#define ll li
#define readi(x) scanf("%d",&x)
#define  reads(x)  scanf("%s", x)
#define readl(x) scanf("%I64d",&x)
#define rep(i,n) for(i=0;i<n;i++)
#define revp(i,n) for(i=(n-1);i>=0;i--)
#define myrep1(i,a,b) for(i=a;i<=b;i++)
#define myrep2(i,a,b) for(i=b;i>=a;i--)
#define pb push_back
#define mp make_pair
#define fi first
#define sec second
#define MAXN 1000000000000000000
#define MINN -1000000000000000000
#define pii pair<ll,ll>
#define pdd pair<double,double>
#define pic pair<int,char>
#define N 500550
#define lgn 20
#define ddouble long double
#define minus minu
#define PI 3.1415926535
#define lgn 20

// #define INTMAX 200000000

// using namespace boost;
// #define si short int

using namespace std;
using namespace __gnu_pbds;
typedef priority_queue<pii, vector<pii> > max_pq;
typedef priority_queue<pii, vector<pii> , greater<pii >  > min_pq;
ll toint(const string &s) {stringstream ss; ss << s; ll x; ss >> x; return x;}
string tostring ( ll number ){stringstream ss; ss<< number; return ss.str();}

// typedef priority_queue<pair < ll , pair < pii , ll > >  , vector<pair < ll , pair < pii , ll > >  > ,greater<pair < ll , pair < pii , ll > >  > > min_pq;

typedef tree< ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update > OST;
typedef priority_queue< char , vector<char> > max_pqc;
// typedef priority_queue<ll, vector<ll > , greater < ll >  > min_pq;

ll n,l,x,y;
ll ar[ N ];
map < ll , ll > mark;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    #ifndef ONLINE_JUDGE
        freopen("input.txt","r",stdin);
        freopen("output.txt","w",stdout);
    #endif
    cin >> n >> l >> x >> y;
    for ( ll i = 1; i <= n; i ++)
    {
        cin >> ar[i];
    }
    mark[0] = 1;
    ll pos = 0,pos2 = 0;
    bool xy = 0,xx = 0,yy = 0,xy2;
    for ( ll i = 2; i <= n ;  i++)
    {
        if ( mark[ar[i]-x] )
            xx = 1;
        if ( mark[ar[i]-y])
            yy = 1;
        if ( mark[ar[i]-x-y])
        {
            pos = ar[i];
            xy = 1;
        }
        if ( mark[ar[i]-y+x] )
        {
            pos2 = ar[i];
            xy2 = 1;
        }
        mark[ar[i]]=1;
    }
    if ( xx and yy )
        cout <<"0";
    else if ( xx )
    {
        cout <<"1\n";
        cout <<y;
    }
    else if ( yy )
    {
        cout <<"1\n";
        cout <<x;
    }
    else
    {
        if ( xy )
        {
            cout <<"1\n";
            cout << (pos-x);
        }
        else if ( xy2 )
        {
            cout <<"1\n";
            cout << (pos+x);
        }
        else
        {
            cout <<"2\n";
            cout << x <<" " << y ;
        }
    }

}


#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<bits/stdc++.h>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<bitset>
// #include < unordered_map >
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
// #include "boost/algorithm/string.hpp"
#define fio ios_base::sync_with_stdio(false)
#define mod 1000000007
#define mod1 mod
#define mod2 100000009
#define li long long int
#define ll li
#define readi(x) scanf("%d",&x)
#define  reads(x)  scanf("%s", x)
#define readl(x) scanf("%I64d",&x)
#define rep(i,n) for(i=0;i<n;i++)
#define revp(i,n) for(i=(n-1);i>=0;i--)
#define myrep1(i,a,b) for(i=a;i<=b;i++)
#define myrep2(i,a,b) for(i=b;i>=a;i--)
#define pb push_back
#define mp make_pair
#define fi first
#define sec second
#define MAXN 1000000000000000000
#define MINN -1000000000000000000
#define pii pair<ll,ll>
#define pdd pair<double,double>
#define pic pair<int,char>
#define N 500550
#define lgn 20
#define ddouble long double
#define minus minu
#define PI 3.1415926535
#define lgn 20

// #define INTMAX 200000000

// using namespace boost;
// #define si short int

using namespace std;
using namespace __gnu_pbds;
typedef priority_queue<pii, vector<pii> > max_pq;
typedef priority_queue<pii, vector<pii> , greater<pii >  > min_pq;
ll toint(const string &s) {stringstream ss; ss << s; ll x; ss >> x; return x;}
string tostring ( ll number ){stringstream ss; ss<< number; return ss.str();}

// typedef priority_queue<pair < ll , pair < pii , ll > >  , vector<pair < ll , pair < pii , ll > >  > ,greater<pair < ll , pair < pii , ll > >  > > min_pq;

typedef tree< ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update > OST;
typedef priority_queue< char , vector<char> > max_pqc;
// typedef priority_queue<ll, vector<ll > , greater < ll >  > min_pq;

ll n,l,x,y;
ll ar[ N ];
map < ll , ll > mark;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    #ifndef ONLINE_JUDGE
        freopen("input.txt","r",stdin);
        freopen("output.txt","w",stdout);
    #endif
    cin >> n >> l >> x >> y;
    for ( ll i = 1; i <= n; i ++)
    {
        cin >> ar[i];
    }
    mark[0] = 1;
    ll pos = 0,pos2 = 0;
    bool xy = 0,xx = 0,yy = 0,xy2=0;
    for ( ll i = 2; i <= n ;  i++)
    {
        if ( mark[ar[i]-x] )
            xx = 1;
        if ( mark[ar[i]-y])
            yy = 1;
        if ( mark[ar[i]-x-y])
        {
            pos = ar[i];
            xy = 1;
        }
        if ( mark[ar[i]-y+x] )
        {
            pos2 = ar[i];
            xy2 = 1;
        }
        mark[ar[i]]=1;
    }
    if ( xx and yy )
        cout <<"0";
    else if ( xx )
    {
        cout <<"1\n";
        cout <<y;
    }
    else if ( yy )
    {
        cout <<"1\n";
        cout <<x;
    }
    else
    {
        if ( xy )
        {
            cout <<"1\n";
            cout << (pos-x);
        }
        else if ( xy2 )
        {
            cout <<"1\n";
            cout << (pos2+x);
        }
        else
        {
            cout <<"2\n";
            cout << x <<" " << y ;
        }
    }

}


#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<bits/stdc++.h>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<bitset>
// #include < unordered_map >
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
// #include "boost/algorithm/string.hpp"
#define fio ios_base::sync_with_stdio(false)
#define mod 1000000007
#define mod1 mod
#define mod2 100000009
#define li long long int
#define ll li
#define readi(x) scanf("%d",&x)
#define  reads(x)  scanf("%s", x)
#define readl(x) scanf("%I64d",&x)
#define rep(i,n) for(i=0;i<n;i++)
#define revp(i,n) for(i=(n-1);i>=0;i--)
#define myrep1(i,a,b) for(i=a;i<=b;i++)
#define myrep2(i,a,b) for(i=b;i>=a;i--)
#define pb push_back
#define mp make_pair
#define fi first
#define sec second
#define MAXN 1000000000000000000
#define MINN -1000000000000000000
#define pii pair<ll,ll>
#define pdd pair<double,double>
#define pic pair<int,char>
#define N 500550
#define lgn 20
#define ddouble long double
#define minus minu
#define PI 3.1415926535
#define lgn 20

// #define INTMAX 200000000

// using namespace boost;
// #define si short int

using namespace std;
using namespace __gnu_pbds;
typedef priority_queue<pii, vector<pii> > max_pq;
typedef priority_queue<pii, vector<pii> , greater<pii >  > min_pq;
ll toint(const string &s) {stringstream ss; ss << s; ll x; ss >> x; return x;}
string tostring ( ll number ){stringstream ss; ss<< number; return ss.str();}

// typedef priority_queue<pair < ll , pair < pii , ll > >  , vector<pair < ll , pair < pii , ll > >  > ,greater<pair < ll , pair < pii , ll > >  > > min_pq;

typedef tree< ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update > OST;
typedef priority_queue< char , vector<char> > max_pqc;
// typedef priority_queue<ll, vector<ll > , greater < ll >  > min_pq;

ll n,l,x,y;
ll ar[ N ];
map < ll , ll > mark;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    #ifndef ONLINE_JUDGE
        freopen("input.txt","r",stdin);
        freopen("output.txt","w",stdout);
    #endif
    cin >> n >> l >> x >> y;
    for ( ll i = 1; i <= n; i ++)
    {
        cin >> ar[i];
    }
    mark[0] = 1;
    vector < ll > pos,pos2;
    bool xy = 0,xx = 0,yy = 0,xy2=0;
    for ( ll i = 2; i <= n ;  i++)
    {
        if ( mark[ar[i]-x] )
            xx = 1;
        if ( mark[ar[i]-y])
            yy = 1;
        if ( mark[ar[i]-x-y])
        {
            pos.pb(ar[i]);
            xy = 1;
        }
        if ( mark[ar[i]-y+x] )
        {
            pos2.pb(ar[i]);
            xy2 = 1;
        }
        mark[ar[i]]=1;
    }
    if ( xx and yy )
        cout <<"0";
    else if ( xx )
    {
        cout <<"1\n";
        cout <<y;
    }
    else if ( yy )
    {
        cout <<"1\n";
        cout <<x;
    }
    else
    {
        if ( xy )
        {
            for (  ll i = 0 ;i < pos.size(); i ++)
            {
                if ( pos[i] - x >= 0 )
                {
                    cout <<"1\n";
                    cout << (pos[i]-x);
                    return 0;
                }
            }

        }
        if ( xy2 )
        {
            for (  ll i = 0 ;i < pos2.size(); i ++)
            {
                if ( pos2[i] + x <= l )
                {
                    cout <<"1\n";
                    cout << (pos2[i]+x);
                    return 0;
                }
                if ( pos2[i] - y >= 0 )
                {
                    cout <<"1\n";
                    cout << (pos2[i]-y);
                    return 0;
                }
            }

        }

        cout <<"2\n";
        cout << x <<" " << y ;
    }

}


#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;

#define ll long long
#define db long double
#define ii pair<int,int>
#define vi vector<int>
#define fi first
#define se second
#define sz(a) (int)(a).size()
#define all(a) (a).begin(),(a).end()
#define pb push_back
#define mp make_pair
#define FN(i, n) for (int i = 0; i < (int)(n); ++i)
#define FEN(i,n) for (int i = 1;i <= (int)(n); ++i)
#define rep(i,a,b) for(int i=a;i<b;i++)
#define repv(i,a,b) for(int i=b-1;i>=a;i--)
#define SET(A, val) memset(A, val, sizeof(A))
typedef tree<int ,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>ordered_set ;
// order_of_key (val): returns the no. of values less than val
// find_by_order (k): returns the kth largest element.(0-based)
#define TRACE
#ifdef TRACE
#define trace(...) __f(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1>
void __f(const char* name, Arg1&& arg1){
  cerr << name << " : " << arg1 << std::endl;
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args){
  const char* comma = strchr(names + 1, ','); cerr.write(names, comma - names) << " : " << arg1<<" | ";__f(comma+1, args...);
}
#else
#define trace(...)
#endif
const int N=100005;
map<int,bool> m;
int a[N];
int main()
{
  std::ios::sync_with_stdio(false);
  cin.tie(NULL) ; cout.tie(NULL) ;
  int n,l,x,y;
  cin>>n>>l>>x>>y;
  rep(i,1,n+1) cin>>a[i],m[a[i]];
  bool ok1=false,ok2=false;
  rep(i,2,n)
    {
      if(m.count(a[i]-x)) ok1=true;
      if(m.count(a[i]+x)) ok1=true;
      if(m.count(a[i]-y)) ok2=true;
      if(m.count(a[i]+y)) ok2=true;
    }
  if(ok1 && ok2)
    {
      cout<<0<<endl;
      return 0;
    }
  if(ok1 || ok2)
    {
      int ans;
      if(ok1) ans=y; else ans=x;
      cout<<1<<endl<<ans<<endl;
      return 0;
    }
  rep(i,1,n+1)
    {
      int nxt=a[i]+x;
      if(nxt<=l)
	{
	  if(m.count(nxt-y) || m.count(nxt+y))
	    {
	      cout<<1<<endl;
	      cout<<nxt<<endl;
	      return 0;
	    }
	}
      nxt=a[i]-x;
      if(nxt>=0)
	{
	  if(m.count(nxt-y) || m.count(nxt+y))
	    {
	      cout<<1<<endl;
	      cout<<nxt<<endl;
	      return 0;
	    }
	}
    }
  cout<<2<<endl;
  cout<<x<<" "<<y<<endl;
  return 0 ;
}


#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;

#define ll long long
#define db long double
#define ii pair<int,int>
#define vi vector<int>
#define fi first
#define se second
#define sz(a) (int)(a).size()
#define all(a) (a).begin(),(a).end()
#define pb push_back
#define mp make_pair
#define FN(i, n) for (int i = 0; i < (int)(n); ++i)
#define FEN(i,n) for (int i = 1;i <= (int)(n); ++i)
#define rep(i,a,b) for(int i=a;i<b;i++)
#define repv(i,a,b) for(int i=b-1;i>=a;i--)
#define SET(A, val) memset(A, val, sizeof(A))
typedef tree<int ,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>ordered_set ;
// order_of_key (val): returns the no. of values less than val
// find_by_order (k): returns the kth largest element.(0-based)
#define TRACE
#ifdef TRACE
#define trace(...) __f(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1>
void __f(const char* name, Arg1&& arg1){
  cerr << name << " : " << arg1 << std::endl;
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args){
  const char* comma = strchr(names + 1, ','); cerr.write(names, comma - names) << " : " << arg1<<" | ";__f(comma+1, args...);
}
#else
#define trace(...)
#endif
const int N=100005;
map<int,bool> m;
int a[N];
int main()
{
  std::ios::sync_with_stdio(false);
  cin.tie(NULL) ; cout.tie(NULL) ;
  int n,l,x,y;
  cin>>n>>l>>x>>y;
  rep(i,1,n+1) cin>>a[i],m[a[i]];
  bool ok1=false,ok2=false;
  rep(i,1,n+1)
    {
      if(m.count(a[i]-x)) ok1=true;
      if(m.count(a[i]+x)) ok1=true;
      if(m.count(a[i]-y)) ok2=true;
      if(m.count(a[i]+y)) ok2=true;
    }
  if(ok1 && ok2)
    {
      cout<<0<<endl;
      return 0;
    }
  if(ok1 || ok2)
    {
      int ans;
      if(ok1) ans=y; else ans=x;
      cout<<1<<endl<<ans<<endl;
      return 0;
    }
  rep(i,1,n+1)
    {
      int nxt=a[i]+x;
      if(nxt<=l)
	{
	  if(m.count(nxt-y) || m.count(nxt+y))
	    {
	      cout<<1<<endl;
	      cout<<nxt<<endl;
	      return 0;
	    }
	}
      nxt=a[i]-x;
      if(nxt>=0)
	{
	  if(m.count(nxt-y) || m.count(nxt+y))
	    {
	      cout<<1<<endl;
	      cout<<nxt<<endl;
	      return 0;
	    }
	}
    }
  cout<<2<<endl;
  cout<<x<<" "<<y<<endl;
  return 0 ;
}


#include <map>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int n,l,x,y;
int a[100001];
map<int,bool> m;
void check(int d,int t){
	if(d>l||d<0)return;
	if(m[d-t]||m[d+t]){
		printf("%d\n",d);
		exit(0);
	}
}
int main(){
	scanf("%d%d%d%d",&n,&l,&x,&y);
	int i;
	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
		m[a[i]]=true;
	}
	bool xok=false,yok=false;
	for(i=0;i<n;i++){
		xok|=(m[a[i]-x]);
		xok|=(m[a[i]+x]);
		yok|=(m[a[i]-y]);
		yok|=(m[a[i]+y]);
	}
	if(xok&&yok){
		printf("0\n");
		return 0;
	}
	if(xok&&!yok){
		printf("1\n%d\n",y);
		return 0;
	}
	if(!yok&&xok){
		printf("1\n%d\n",x);
		return 0;
	}
	for(i=0;i<n;i++){
		check(a[i]+x,y);
		check(a[i]-x,y);
		check(a[i]+y,x);
		check(a[i]-y,x);
	}
	printf("2\n%d %d\n",x,y);
	return 0;
}


#include <map>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int n,l,x,y;
int a[100001];
map<int,bool> m;
void check(int d,int t){
	if(d>l||d<0)return;
	if(m[d-t]||m[d+t]){
		printf("1\n%d\n",d);
		exit(0);
	}
}
int main(){
	scanf("%d%d%d%d",&n,&l,&x,&y);
	int i;
	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
		m[a[i]]=true;
	}
	bool xok=false,yok=false;
	for(i=0;i<n;i++){
		xok|=(m[a[i]-x]);
		xok|=(m[a[i]+x]);
		yok|=(m[a[i]-y]);
		yok|=(m[a[i]+y]);
	}
	if(xok&&yok){
		printf("0\n");
		return 0;
	}
	if(xok&&!yok){
		printf("1\n%d\n",y);
		return 0;
	}
	if(yok&&!xok){
		printf("1\n%d\n",x);
		return 0;
	}
	for(i=0;i<n;i++){
		check(a[i]+x,y);
		check(a[i]-x,y);
		check(a[i]+y,x);
		check(a[i]-y,x);
	}
	printf("2\n%d %d\n",x,y);
	return 0;
}


#include <map>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int n,l,x,y;
int a[100001];
map<int,bool> m;
void check(int d,int t){
	if(d>l||d<0)return;
	if(m[d-t]||m[d+t]){
		printf("1\n%d\n",d);
		exit(0);
	}
}
int main(){
	scanf("%d%d%d%d",&n,&l,&x,&y);
	int i;
	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
		m[a[i]]=true;
	}
	bool xok=false,yok=false;
	for(i=0;i<n;i++){
		xok|=(m[a[i]-x]);
		xok|=(m[a[i]+x]);
		yok|=(m[a[i]-y]);
		yok|=(m[a[i]+y]);
	}
	if(xok&&yok){
		printf("0\n");
		return 0;
	}
	if(xok&&!yok){
		printf("1\n%d\n",y);
		return 0;
	}
	if(!yok&&xok){
		printf("1\n%d\n",x);
		return 0;
	}
	for(i=0;i<n;i++){
		check(a[i]+x,y);
		check(a[i]-x,y);
		check(a[i]+y,x);
		check(a[i]-y,x);
	}
	printf("2\n%d %d\n",x,y);
	return 0;
}


#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define vi vector<int>
#define pb push_back
#define F first
#define S second
#define sd(x) scanf("%d", &(x))

int a[100005];
set<int> st;
int main(){
	int n, l, x, y;
	sd(n), sd(l), sd(x), sd(y);
	if(x > y) swap(x, y);
	bool fx = 0, fy = 0;
	for(int i = 1; i <= n; i++){
		sd(a[i]);
		if(st.count(a[i] - x)) fx = 1;
		if(st.count(a[i] - y)) fy = 1;
		st.insert(a[i]);
	}
	if(fx && fy){
		printf("0\n");
		return 0;
	}

	if(x == y){
		printf("%d\n%d", 1, x);
		return 0;
	}

	if(fx && !fy){
		printf("%d\n%d", 1, y);
		return 0;
	}

	if(fy && !fx){
		printf("%d\n%d", 1, x);
		return 0;
	}

	for(int i = 1; i <= n; i++){
		int z = a[i] + y;
		if(z <= l && (st.count(z - x) || st.count(z + x))){
			printf("%d\n%d", 1, z);
			return 0;
		}
		z = a[i] - y;
		if(z >= 0 && (st.count(z - x) || st.count(z + x))){
			printf("%d\n%d", 1, z);
			return 0;
		}
	}
	printf("%d\n%d %d", 2, x, y);
}


#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<set>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define maxn 100005
using namespace std;

int n,l,x,y;

int a[maxn];

set<int> s;

bool check(int x){
	fo(i,1,n) {
		int tmp=a[i]+x;
		if (s.find(tmp)!=s.end()) return 1;
		tmp=a[i]-x;
		if (s.find(tmp)!=s.end()) return 1;
	}
	return 0;
}

void getans(){
	fo(i,1,n) {
		int tmp=a[i]-x;
		if (tmp>=0 && tmp<=l) {
			if (s.find(tmp-y)!=s.end() || s.find(tmp+y)!=s.end()) {
				cout<<1<<endl;
				cout<<tmp<<endl;
				return;
			}
		}
		tmp=a[i]+x;
		if (tmp>=0 && tmp<=l) {
			if (s.find(tmp-y)!=s.end() || s.find(tmp+y)!=s.end()) {
				cout<<1<<endl;
				cout<<tmp<<endl;
				return;
			}
		}
	}
	cout<<2<<endl;
	cout<<x<<" "<<y;
}

int main(){
	scanf("%d%d%d%d",&n,&l,&x,&y);
	fo(i,1,n) scanf("%d",&a[i]),s.insert(a[i]);
	bool ok1=check(x),ok2=check(y);
	if (ok1 && ok2) {
		cout<<0;
		return 0;
	}
	if (ok1 && ok2==0) {
		cout<<1<<endl;
		cout<<y;
		return 0;
	}
	if (ok1==0 && ok2) {
		cout<<1<<endl;
		cout<<x;
		return 0;
	}
	getans();
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

int main(int argc, char const *argv[]) {
    long n, l, x, y, num; cin>>n>>l>>x>>y;
    long arr[n]; unordered_set<long> st;
    for(int i=0; i<n; i++){
        cin>>num; arr[i] = num;
        st.insert(num);
    }

    bool xposs = false, yposs = false;
    for(int i=0; i<n-1 and !xposs; i++){
        if(st.find(arr[i] + x) != st.end())
            xposs = true;
    }
    for(int i=0; i<n-1 and !yposs; i++){
        if(st.find(arr[i] + y) != st.end())
            yposs = true;
    }

    long mn = *min_element(arr, arr+n);
    if(xposs and yposs) cout<<0<<endl;
    else if(xposs) cout<<1<<endl<<mn+y<<endl;
    else{
        unordered_set<long> pmx;
        for(int i=0; i<n; i++){
            pmx.insert(arr[i]+x);
            pmx.insert(arr[i]-x);
        }
        int f_idx = -1;
        for(int i=0; i<n and f_idx==-1; i++){
            if(pmx.find(arr[i]+y) != pmx.end()) f_idx = i;
            if(arr[i]>=y and pmx.find(arr[i]-y) != pmx.end()) f_idx = i;
        }

        if(f_idx != -1) cout<<1<<endl<<arr[f_idx]+y<<endl;
        else cout<<2<<endl<<mn+x<<" "<<mn+y<<endl;
    }

    return 0;
}


#include <bits/stdc++.h>

using namespace std;

int main(int argc, char const *argv[]) {
    long n, l, x, y, num; cin>>n>>l>>x>>y;
    long arr[n]; unordered_set<long> st;
    for(int i=0; i<n; i++){
        cin>>num; arr[i] = num;
        st.insert(num);
    }

    bool xposs = false, yposs = false;
    for(int i=0; i<n-1 and !xposs; i++){
        if(st.find(arr[i] + x) != st.end())
            xposs = true;
    }
    for(int i=0; i<n-1 and !yposs; i++){
        if(st.find(arr[i] + y) != st.end())
            yposs = true;
    }

    long mn = *min_element(arr, arr+n);
    if(xposs and yposs) cout<<0<<endl;
    else if(xposs) cout<<1<<endl<<mn+y<<endl;
    else cout<<2<<endl<<mn+x<<" "<<mn+y<<endl;

    return 0;
}