#include <bits/stdc++.h>

#define X first
#define Y second
#define FOR(i, a, b) for (i=(a); i <= (b); i++)
#define FORD(i, a, b) for (i=(a); i >= (b); i--)
#define itr(t) vector<t>::iterator
#define ritr(t) vector<t>::reverse_iterator
#define IT(i, v) for (i=(v)->begin(); i != (v)->end(); i++)
#define RIT(i, v) for (i=(v)->rbegin(); i != (v)->rend(); i++)
#define abs(x) ((x) > 0 ? (x) : -(x))
#define MAX_HEAP(t) priority_queue<t>
#define MIN_HEAP(t) priority_queue<t, vector<t>, greater<t> >
#define input_file "input.txt"
#define output_file "output.txt"

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> ii;
typedef pair<int, ii> iii;
typedef vector<ll> vi;
typedef stack<int> si;

inline ll gcd(ll a, ll b)
{
    return (a ? gcd(b%a, a) : b);
}

#define N 111111
#define M 290611

int n, i;
ll l, x, y, sum, a[N];
vi h[M];

inline bool have(ll x)
{
	if (x < 0) return false;
	itr(ll) it;
	ll y=x%M;
	IT(it, &h[y])
		if (*it==x) return true;
	return false;
}

inline void Append(ll x)
{
	h[x%M].push_back(x);
}

inline void Add(ll x)
{
	int i, j;
	ll other=sum-x;
	bool exist=false;
	FOR(i, 1, n)
		if (have(a[i]+x))
		{
			FOR(j, 1, n)
				if (have(a[j]+other))
				{
					printf("0");
					exit(0);
				}
			cout << 1 << endl << other;
			exit(0);
		}
	FOR(i, 1, n)
	{
		if (a[i]+x <= l and (have(a[i]+x-other) or have(a[i]+x+other)))
		{
			cout << 1 << endl << a[i]+x;
			exit(0);
		}
		if (a[i]-x >= 0 and (have(a[i]-x-other) or have(a[i]-x+other)))
		{
			cout << 1 << endl << a[i]-x;
			exit(0);
		}
	}
}

main()
{
    //freopen(input_file, "r", stdin);
    //freopen(output_file, "w", stdout);
    cin >> n >> l >> x >> y;
    sum=x+y;
    FOR(i, 1, n)
    {
    	cin >> a[i];
    	Append(a[i]);
    }
    Add(x);
    Add(y);
    cout << 2 << endl << x << " " << y;
}


#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<set>
using namespace std;
int a,s,d,f,g,h,j=1000000000,k,l,i,n,m;
set<int> x,z,c;
main(){
cin>>n>>m>>k>>l;
for(i=0;i<n;i++){
scanf("%d",&a);

x.insert(a+k);
c.insert(a+l);
s=x.size();
x.insert(a);
if(x.size()==s) {d=1;}
s=c.size();
c.insert(a);
if(c.size()==s) {f=1;}
s=z.size();
z.insert(a+k);
if(s==z.size()) if(a+k<m)j=a+k; else if(a-l>0) j=a-l;
s=z.size();
z.insert(a+l);
if(s==z.size()) if(a+l<m)j=a+l; else if(a-k>0) j=a-k;
}
if(d+f==2) cout<<0; else
if(d+f==1) {cout<<1<<endl;
if(d==0) cout<<k; else cout<<l;} else
if(j!=0) cout<<1<<endl<<j; else cout<<2<<endl<<k<<" "<<l;
}


#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<set>
using namespace std;
long long a,s,d,f,g,h,j,k,l,i,n,m;
set<long long> x,z,c,v;
main(){
cin>>n>>m>>k>>l;
for(i=0;i<n;i++){
scanf("%d",&a);

x.insert(a+k);
c.insert(a+l);
s=x.size();
x.insert(a);
if(x.size()==s) {d=1;}
s=c.size();
c.insert(a);
if(c.size()==s) {f=1;}
s=z.size();
z.insert(a+k);
if(s==z.size()) if(a+k<m)j=a+k; else if(a-l>0) j=a-l;
s=z.size();
z.insert(a+l);
if(s==z.size()) if(a+l<m)j=a+l; else if(a-k>0) j=a-k;

z.insert(a-k);
if(s==z.size()) j=a-k;
s=z.size();
z.insert(a-l);
if(s==z.size()) j=a-l;

}

if(d+f==2) cout<<0; else
if(d+f==1) {cout<<1<<endl;
if(d==0) cout<<k; else cout<<l;} else
if(j!=0) cout<<1<<endl<<j; else cout<<2<<endl<<k<<" "<<l;
}


#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<set>
using namespace std;
long long a,s,d,f,g,h,j,k,l,i,n,m;
set<long long> x,z,c,v;
main(){
cin>>n>>m>>k>>l;
for(i=0;i<n;i++){
scanf("%d",&a);

x.insert(a+k);
c.insert(a+l);
s=x.size();
x.insert(a);
if(x.size()==s) {d=1;}
s=c.size();
c.insert(a);
if(c.size()==s) {f=1;}
s=z.size();
z.insert(a+k);
if(s==z.size()) if(a+k<m)j=a+k; else if(a-l>0) j=a-l;
s=z.size();
z.insert(a+l);
if(s==z.size()) if(a+l<m)j=a+l; else if(a-k>0) j=a-k;

z.insert(a-k);
if(s==z.size() && a-k>0) j=a-k;
s=z.size();
z.insert(a-l);
if(s==z.size() && a-l>0) j=a-l;

}

if(d+f==2) cout<<0; else
if(d+f==1) {cout<<1<<endl;
if(d==0) cout<<k; else cout<<l;} else
if(j!=0) cout<<1<<endl<<j; else cout<<2<<endl<<k<<" "<<l;
}


#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<set>
using namespace std;
long long a,s,d,f,g,h,j,k,l,i,n,m;
set<long long> x,z,c,v;
main(){
cin>>n>>m>>k>>l;
for(i=0;i<n;i++){
scanf("%d",&a);

x.insert(a+k);
c.insert(a+l);
s=x.size();
x.insert(a);
if(x.size()==s) {d=1;}
s=c.size();
c.insert(a);
if(c.size()==s) {f=1;}
s=z.size();
z.insert(a+k);
if(s==z.size()) if(a+k<m)j=a+k; else if(a-l>0) j=a-l;
s=z.size();
z.insert(a+l);
if(s==z.size()) if(a+l<m)j=a+l; else if(a-k>0) j=a-k;

z.insert(a+k);
if(s==z.size() && a+k<m) j=a+k;
s=z.size();
z.insert(a-l);
if(s==z.size() && a-l>0) j=a-l;

}

if(d+f==2) cout<<0; else
if(d+f==1) {cout<<1<<endl;
if(d==0) cout<<k; else cout<<l;} else
if(j!=0) cout<<1<<endl<<j; else cout<<2<<endl<<k<<" "<<l;
}


#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<set>
using namespace std;
int a,s,d,f,g,h,j,k,l,i,n,m;
set<int> x,z,c;
main(){
cin>>n>>m>>k>>l;
for(i=0;i<n;i++){
scanf("%d",&a);

x.insert(a+k);
c.insert(a+l);
s=x.size();
x.insert(a);
if(x.size()==s) {d=1;}
s=c.size();
c.insert(a);
if(c.size()==s) {f=1;}
s=z.size();
z.insert(a+k);
if(s==z.size()) if(a+k<m)j=a+k; else if(a-l>0) j=a-l;
s=z.size();
z.insert(a+l);
if(s==z.size()) if(a+l<m)j=a+l; else if(a-k>0) j=a-k;
}
if(d+f==2) cout<<0; else
if(d+f==1) {cout<<1<<endl;
if(d==0) cout<<k; else cout<<l;} else
if(j!=0) cout<<1<<endl<<j; else cout<<2<<endl<<k<<" "<<l;
}


#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<set>
using namespace std;
long long a,s,d,f,g,h,j,k,l,i,n,m;
set<long long> x,z,c,v;
main(){
cin>>n>>m>>k>>l;
for(i=0;i<n;i++){
scanf("%d",&a);

x.insert(a+k);
c.insert(a+l);
s=x.size();
x.insert(a);
if(x.size()==s) {d=1;}
s=c.size();
c.insert(a);
if(c.size()==s) {f=1;}
s=z.size();
z.insert(a+k);
if(s==z.size()) if(a+k<m)j=a+k; else if(a-l>0) j=a-l;
s=z.size();
z.insert(a+l);
if(s==z.size()) if(a+l<m)j=a+l; else if(a-k>0) j=a-k;
s=v.size();
v.insert(a+k);
if(s==v.size() && a+k<m) j=a+k;
s=v.size();
v.insert(a-l);
if(s==v.size() && a-l>0) j=a-l;

}

if(d+f==2) cout<<0; else
if(d+f==1) {cout<<1<<endl;
if(d==0) cout<<k; else cout<<l;} else
if(j!=0) cout<<1<<endl<<j; else cout<<2<<endl<<k<<" "<<l;
}


#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<set>
using namespace std;
long long a,s,d,f,g,h,j,k,l,i,n,m;
set<long long> x,z,c;
main(){
cin>>n>>m>>k>>l;
for(i=0;i<n;i++){
scanf("%d",&a);

x.insert(a+k);
c.insert(a+l);
s=x.size();
x.insert(a);
if(x.size()==s) {d=1;}
s=c.size();
c.insert(a);
if(c.size()==s) {f=1;}
s=z.size();
z.insert(a+k);
if(s==z.size()) if(a+k<m)j=a+k; else if(a-l>0) j=a-l;
s=z.size();
z.insert(a+l);
if(s==z.size()) if(a+l<m)j=a+l; else if(a-k>0) j=a-k;
}
if(d+f==2) cout<<0; else
if(d+f==1) {cout<<1<<endl;
if(d==0) cout<<k; else cout<<l;} else
if(j!=0) cout<<1<<endl<<j; else cout<<2<<endl<<k<<" "<<l;
}


#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<set>
using namespace std;
int a,s,d,f,g,h,j,k,l,i,n,m;
set<int> x,z,c;
main(){
cin>>n>>m>>k>>l;
for(i=0;i<n;i++){
scanf("%d",&a);

x.insert(a+k);
c.insert(a+l);
s=x.size();
x.insert(a);
if(x.size()==s) {d=1;}
s=c.size();
c.insert(a);
if(c.size()==s) {f=1;}
s=z.size();
z.insert(a+k);
if(s==z.size()) j=a+k;
s=z.size();
z.insert(a+l);
if(s==z.size()) j=a+l;
}
if(d+f==2) cout<<0; else
if(d+f==1) {cout<<1<<endl;
if(d==0) cout<<k; else cout<<l;} else
if(z.size()!=2*n) cout<<1<<endl<<j; else cout<<2<<endl<<k<<" "<<l;
}


#include <iostream>
#include <string>
#include <vector>
#include <cstdio>
#include <set>
#include <queue>
#include <algorithm>
#include <cstring>
#include <map>
#include <cmath>
#include <cstdio>
#include <sstream>
#include <stack>
#define open_in(n) freopen("n","r",stdin)
#define open_out(n) freopen("n","w",stdout)
#define rep(i,n) for (int i=0;i<n;i++)
#define repw(i,w) for(int i=w;i>0;i--)
#define repn(i,m,n) for (int i=n;i<m;i++)
#define for_all(it,n) for(__typeof((n).begin()) it=(n).begin();it!=(n).end();it++)
#define IT iterator
#define Size(n) (int)((n).size())
#define pb push_back
#define mp make_pair
#define p pair
#define all(n) (n).begin(),(n).end
#define dump(n) cerr<<#n<<"="<<(n)<<endl
#define _abs(a) ((a)>0?(a):-(a))
using namespace std;
typedef pair<int,int> pi;
typedef vector<int> vi;
typedef long long ll;
typedef map<int,int> mi;int n,v[100005];
pi find_first(int x)
{
	int l=0;
	for (int i=0;i<n;i++)
	{
		while(l<n && v[l]+x<v[i]) l++;
		if(v[l]+x==v[i]) return pi(v[l],v[i]);
	}
	return pi(-1,-1);
}
pi find_last(int x)
{
	int i=n-1;
	for (int l=n-1;l>=0;l--)
	{
		while(i>=0 && v[l]+x<v[i]) i--;
		if(v[l]+x==v[i]) return pi(v[l],v[i]);
	}
	return pi(-1,-1);
}
void slove ()
{
	int l,x,y;
	scanf("%d%d%d%d",&n,&l,&x,&y);
	for(int i=0;i<n;i++) scanf("%d",&v[i]);
	bool xok=find_first(x) !=pi(-1,-1),yok=find_first(y) !=pi(-1,-1);
	if(xok && yok)
	{
		cout<<0<<endl;
		return;
	}
	else if(xok)
	{
		cout<<1<<endl;
		cout<<y<<endl;
		return;
	}
	else if(yok)
	{
		cout<<1<<endl;
		cout<<x<<endl;
		return;
	}
	pi ss=find_last(x+y);
	if(ss!=pi(-1,-1))
	{
		cout<<1<<endl;
		cout<<ss.first+x<<endl;
		return;
	}
	ss=find_last(y-x);
	if(ss!=pi(-1,-1) && ss.first+y<=l)
	{
		cout<<1<<endl;
		cout<<ss.first+y<<endl;
		return;
	}
	ss=find_last(y-x);
	if(ss!=pi(-1,-1) && ss.first-x>=0)
	{
		cout<<1<<endl;
		cout<<ss.first-x<<endl;
		return;
	}
	cout<<2<<endl;
	cout<<x<<" "<<y<<endl;
}
int main()
{
	slove();
}


#include <iostream>
#include <string>
#include <vector>
#include <cstdio>
#include <set>
#include <queue>
#include <algorithm>
#include <cstring>
#include <map>
#include <cmath>
#include <cstdio>
#include <sstream>
#include <stack>
#define open_in(n) freopen("n","r",stdin)
#define open_out(n) freopen("n","w",stdout)
#define rep(i,n) for (int i=0;i<n;i++)
#define repw(i,w) for(int i=w;i>0;i--)
#define repn(i,m,n) for (int i=n;i<m;i++)
#define for_all(it,n) for(__typeof((n).begin()) it=(n).begin();it!=(n).end();it++)
#define IT iterator
#define Size(n) (int)((n).size())
#define pb push_back
#define mp make_pair
#define p pair
#define all(n) (n).begin(),(n).end
#define dump(n) cerr<<#n<<"="<<(n)<<endl
#define _abs(a) ((a)>0?(a):-(a))
using namespace std;
typedef pair<int,int> pi;
typedef vector<int> vi;
typedef long long ll;
typedef map<int,int> mi;
map<int,bool> m;
bool xok,yok;
ll n,l,x,y,a[100005];
void check(int d,int t)
{
	if(d<0 || d>l) return;
	if(m[d-t] || m[d+t])
	{
		cout<<"1"<<endl;
		cout<<d<<endl;
		exit(0);
	}
}
int main()
{
	cin>>n>>l>>x>>y;
	for (int i=0;i<n;i++)
	{
		cin>>a[i];
		m[a[i]]=true;
	}
	for (int 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)
	{
		cout<<"0"<<endl;
		return 0;
	}
	else if(xok)
	{
		cout<<"1"<<endl;
		cout<<y<<endl;
		return 0;
	}
	else if(yok)
	{
		cout<<"1"<<endl;
		cout<<x<<endl;
		return 0;
	}
	else
	{
		for (int 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);
		}
	    cout<<"2"<<endl;
	    cout<<x<<" "<<y<<endl;
	}
	return 0;
}


#include <iostream>
#include <string>
#include <vector>
#include <cstdio>
#include <set>
#include <queue>
#include <algorithm>
#include <cstring>
#include <map>
#include <cmath>
#include <cstdio>
#include <sstream>
#include <stack>
#include <stdio.h>
#define open_in(n) freopen("n","r",stdin)
#define open_out(n) freopen("n","w",stdout)
#define rep(i,n) for (int i=0;i<n;i++)
#define repw(i,w) for(int i=w;i>0;i--)
#define repn(i,m,n) for (int i=n;i<m;i++)
#define for_all(it,n) for(__typeof((n).begin()) it=(n).begin();it!=(n).end();it++)
#define IT iterator
#define Size(n) (int)((n).size())
#define pb push_back
#define mp make_pair
#define p pair
#define all(n) (n).begin(),(n).end
#define dump(n) cerr<<#n<<"="<<(n)<<endl
#define _abs(a) ((a)>0?(a):-(a))
using namespace std;
typedef pair<int,int> pi;
typedef vector<int> vi;
typedef long long ll;
typedef map<int,int> mi;int n,v[100005];
pi find_first(int x)
{
	int l=0;
	for (int i=0;i<n;i++)
	{
		while(l<n && v[l]+x<v[i]) l++;
		if(v[l]+x==v[i]) return pi(v[l],v[i]);
	}
	return pi(-1,-1);
}
pi find_last(int x)
{
	int i=n-1;
	for (int l=n-1;l>=0;l--)
	{
		while(i>=0 && v[l]+x<v[i]) i--;
		if(v[l]+x==v[i]) return pi(v[l],v[i]);
	}
	return pi(-1,-1);
}
void slove ()
{
	int l,x,y;
	scanf("%d%d%d%d",&n,&l,&x,&y);
	for(int i=0;i<n;i++) scanf("%d",&v[i]);
	bool xok=find_first(x) !=pi(-1,-1),yok=find_first(y) !=pi(-1,-1);
	if(xok && yok)
	{
		cout<<0<<endl;
		return;
	}
	else if(xok)
	{
		cout<<1<<endl;
		cout<<y<<endl;
		return;
	}
	else if(yok)
	{
		cout<<1<<endl;
		cout<<x<<endl;
		return;
	}
	pi ss=find_last(x+y);
	if(ss!=pi(-1,-1))
	{
		cout<<1<<endl;
		cout<<ss.first+x<<endl;
		return;
	}
	ss=find_last(y-x);
	if(ss!=pi(-1,-1) && ss.first+y<=l)
	{
		cout<<1<<endl;
		cout<<ss.first+y<<endl;
		return;
	}
	ss=find_last(y-x);
	if(ss!=pi(-1,-1) && ss.first-x>=0)
	{
		cout<<1<<endl;
		cout<<ss.first-x<<endl;
		return;
	}
	cout<<2<<endl;
	cout<<x<<" "<<y<<endl;
}
int main()
{
	slove();
}


#include <iostream>
#include <string>
#include <vector>
#include <cstdio>
#include <set>
#include <queue>
#include <algorithm>
#include <cstring>
#include <map>
#include <cmath>
#include <cstdio>
#include <sstream>
#include <stack>
#define open_in(n) freopen("n","r",stdin)
#define open_out(n) freopen("n","w",stdout)
#define rep(i,n) for (int i=0;i<n;i++)
#define repw(i,w) for(int i=w;i>0;i--)
#define repn(i,m,n) for (int i=n;i<m;i++)
#define for_all(it,n) for(__typeof((n).begin()) it=(n).begin();it!=(n).end();it++)
#define IT iterator
#define Size(n) (int)((n).size())
#define pb push_back
#define mp make_pair
#define p pair
#define all(n) (n).begin(),(n).end
#define dump(n) cerr<<#n<<"="<<(n)<<endl
#define _abs(a) ((a)>0?(a):-(a))
using namespace std;
typedef pair<int,int> pi;
typedef vector<int> vi;
typedef long long ll;
typedef map<int,int> mi;int n,v[100005];
pi find_first(int x)
{
	int l=0;
	for (int i=0;i<n;i++)
	{
		while(l<n && v[l]+x<v[i]) l++;
		if(v[l]+x==v[i]) return pi(v[l],v[i]);
	}
	return pi(-1,-1);
}
pi find_last(int x)
{
	int l=n-1;
	for (int i=n-1;i>=0;i--)
	{
		while(l>=0 && v[l]+x<v[i]) l--;
		if(v[l]+x==v[i]) return pi(v[l],v[i]);
	}
	return pi(-1,-1);
}
void slove ()
{
	int l,x,y;
	scanf("%d%d%d%d",&n,&l,&x,&y);
	for(int i=0;i<n;i++) scanf("%d",&v[i]);
	bool xok=find_first(x) !=pi(-1,-1),yok=find_first(y) !=pi(-1,-1);
	if(xok && yok)
	{
		cout<<0<<endl;
		return;
	}
	else if(xok)
	{
		cout<<1<<endl;
		cout<<y<<endl;
		return;
	}
	else if(yok)
	{
		cout<<1<<endl;
		cout<<x<<endl;
		return;
	}
	pi ss=find_last(x+y);
	if(ss!=pi(-1,-1))
	{
		cout<<1<<endl;
		cout<<ss.first+x<<endl;
		return;
	}
	ss=find_last(y-x);
	if(ss!=pi(-1,-1) && ss.first+y<=l)
	{
		cout<<1<<endl;
		cout<<ss.first+y<<endl;
		return;
	}
	ss=find_last(y-x);
	if(ss!=pi(-1,-1) && ss.first-x>=0)
	{
		cout<<1<<endl;
		cout<<ss.first-x<<endl;
		return;
	}
	cout<<2<<endl;
	cout<<x<<" "<<y<<endl;
}
int main()
{
	slove();
}


#include <iostream>
#include <string>
#include <vector>
#include <cstdio>
#include <set>
#include <queue>
#include <algorithm>
#include <cstring>
#include <map>
#include <cmath>
#include <cstdio>
#include <sstream>
#include <stack>
#include <stdio.h>
#define open_in(n) freopen("n","r",stdin)
#define open_out(n) freopen("n","w",stdout)
#define rep(i,n) for (int i=0;i<n;i++)
#define repw(i,w) for(int i=w;i>0;i--)
#define repn(i,m,n) for (int i=n;i<m;i++)
#define for_all(it,n) for(__typeof((n).begin()) it=(n).begin();it!=(n).end();it++)
#define IT iterator
#define Size(n) (int)((n).size())
#define pb push_back
#define mp make_pair
#define p pair
#define all(n) (n).begin(),(n).end
#define dump(n) cerr<<#n<<"="<<(n)<<endl
#define _abs(a) ((a)>0?(a):-(a))
using namespace std;
typedef pair<int,int> pi;
typedef vector<int> vi;
typedef long long ll;
typedef map<int,int> mi;int n,v[100005];
pi find_first(int x)
{
	int l=0;
	for (int i=0;i<n;i++)
	{
		while(l<n && v[l]+x<v[i]) l++;
		if(v[l]+x==v[i]) return pi(v[l],v[i]);
	}
	return pi(-1,-1);
}
pi find_last(int x)
{
	int i=n-1;
	for (int l=n-1;l>=0;l--)
	{
		while(i>=0 && v[l]+x<v[i]) i--;
		if(v[l]+x==v[i]) return pi(v[l],v[i]);
	}
	return pi(-1,-1);
}

void slove ()
{
	int l,x,y;
	scanf("%d%d%d%d",&n,&l,&x,&y);
	for(int i=0;i<n;i++) scanf("%d",&v[i]);
	bool xok=find_first(x) !=pi(-1,-1),yok=find_first(y) !=pi(-1,-1);
	if(xok && yok)
	{
		cout<<0<<endl;
		return;
	}
	else if(xok)
	{
		cout<<1<<endl;
		cout<<y<<endl;
		return;
	}
	else if(yok)
	{
		cout<<1<<endl;
		cout<<x<<endl;
		return;
	}
	pi ss=find_last(x+y);
	if(ss!=pi(-1,-1))
	{
		cout<<1<<endl;
		cout<<ss.first+x<<endl;
		return;
	}
	ss=find_last(y-x);
	if(ss!=pi(-1,-1) && ss.first+y<=l)
	{
		cout<<1<<endl;
		cout<<ss.first+y<<endl;
		return;
	}
	ss=find_last(y-x);
	if(ss!=pi(-1,-1) && ss.first-x>=0)
	{
		cout<<1<<endl;
		cout<<ss.first-x<<endl;
		return;
	}
	cout<<2<<endl;
	cout<<x<<" "<<y<<endl;
}
int main()
{
	slove();
}


#include <iostream>
#include <string>
#include <vector>
#include <cstdio>
#include <set>
#include <queue>
#include <algorithm>
#include <cstring>
#include <map>
#include <cmath>
#include <cstdio>
#include <sstream>
#include <stack>
#define open_in(n) freopen("n","r",stdin)
#define open_out(n) freopen("n","w",stdout)
#define rep(i,n) for (int i=0;i<n;i++)
#define repw(i,w) for(int i=w;i>0;i--)
#define repn(i,m,n) for (int i=n;i<m;i++)
#define for_all(it,n) for(__typeof((n).begin()) it=(n).begin();it!=(n).end();it++)
#define IT iterator
#define Size(n) (int)((n).size())
#define pb push_back
#define mp make_pair
#define p pair
#define all(n) (n).begin(),(n).end
#define dump(n) cerr<<#n<<"="<<(n)<<endl
#define _abs(a) ((a)>0?(a):-(a))
using namespace std;
typedef pair<int,int> pi;
typedef vector<int> vi;
typedef long long ll;
typedef map<int,int> mi;
map<int,bool> m;
bool xok,yok;
ll n,l,x,y,a[10005];
void check(int d,int t)
{
	if(d<0 || d>l) return;
	if(m[d-t] || m[d+t])
	{
		cout<<"1"<<endl;
		cout<<d<<endl;
	}
	return;
}
int main()
{
	cin>>n>>l>>x>>y;
	for (int i=0;i<n;i++)
	{
		cin>>a[i];
		m[a[i]]=true;
	}
	for (int 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)
	{
		cout<<"0"<<endl;
		return 0;
	}
	else if(xok)
	{
		cout<<"1"<<endl;
		cout<<y<<endl;
		return 0;
	}
	else if(yok)
	{
		cout<<"1"<<endl;
		cout<<x<<endl;
		return 0;
	}
	else
	{
		for (int 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);
		}
	    cout<<"2"<<endl;
	    cout<<x<<" "<<y<<endl;
	}
	return 0;
}


#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int a[100005],n,l,x,y,p,q;

int bse(int a[],int l,int r,int k)
{
    if (l==r && a[l]!=k) return 0;
    int t=a[(l+r)/2];
    if (t==k) return (l+r)/2;
    else if (t<k) return bse(a,(l+r)/2+1,r,k);
    else return bse(a,l,(l+r)/2,k);
}

int main()
{
    scanf("%d%d%d%d",&n,&l,&x,&y);
    for (int i=1;i<=n;i++) scanf("%d",&a[i]);
    p=0; q=0;
    for (int i=1;i<=n;i++) if (bse(a,1,n,x+a[i]))
    {
        p++;
        break;
    }
    for (int i=1;i<=n;i++) if (bse(a,1,n,y+a[i]))
    {
        q++;
        break;
    }
    if (p&&q) printf("0\n");
    else for (int i=1;i<=n;i++) if (bse(a,1,n,x-y+a[i]))
    {
        printf("1\n%d\n",x+a[i]);
        return 0;
    }
    if (p) printf("1\n%d\n",y);
    else if (q) printf("1\n%d\n",x);
    else
    {
        for (int i=1;i<=n;i++) if (a[i]==x+y) {p=1; break;}
        if (p) printf("1\n%d\n",x);
        else printf("2\n%d %d\n",x,y);
    }
    return 0;
}


#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int a[100005],n,l,x,y,p,q;

int bse(int a[],int l,int r,int k)
{
    if (l==r && a[l]!=k) return 0;
    int t=a[(l+r)/2];
    if (t==k) return (l+r)/2;
    else if (t<k) return bse(a,(l+r)/2+1,r,k);
    else return bse(a,l,(l+r)/2,k);
}

int main()
{
    scanf("%d%d%d%d",&n,&l,&x,&y);
    for (int i=1;i<=n;i++) scanf("%d",&a[i]);
    p=0; q=0;
    for (int i=1;i<=n;i++) if (bse(a,1,n,x+a[i]))
    {
        p++;
        break;
    }
    for (int i=1;i<=n;i++) if (bse(a,1,n,y+a[i]))
    {
        q++;
        break;
    }
    if (p&&q)
    {
        printf("0\n");
        return 0;
    }
    for (int i=1;i<=n;i++) if (bse(a,1,n,x-y+a[i]) && x+a[i]<=l)
    {
        printf("1\n%d\n",x+a[i]);
        return 0;
    }
    for (int i=1;i<=n;i++) if (bse(a,1,n,a[i]+x+y) && a[i]+x<=l)
    {
        printf("1\n%d\n",x+a[i]);
        return 0;
    }
    for (int i=1;i<=n;i++) if (bse(a,1,n,a[i]-x-y) && a[i]-x<=l)
    {
        printf("1\n%d\n",a[i]-x);
        return 0;
    }
    for (int i=1;i<=n;i++) if (bse(a,1,n,a[i]-x+y) && a[i]-x<=l)
    {
        printf("1\n%d\n",a[i]-x);
        return 0;
    }

    if (p) printf("1\n%d\n",y);
    else if (q) printf("1\n%d\n",x);
    else
    {
        for (int i=1;i<=n;i++) if (a[i]==x+y) {p=1; break;}
        if (p) printf("1\n%d\n",x);
        else printf("2\n%d %d\n",x,y);
    }
    return 0;
}


#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int a[100005],n,l,x,y,p,q;

int bse(int a[],int l,int r,int k)
{
    if (l==r && a[l]!=k) return 0;
    int t=a[(l+r)/2];
    if (t==k) return (l+r)/2;
    else if (t<k) return bse(a,(l+r)/2+1,r,k);
    else return bse(a,l,(l+r)/2,k);
}

int main()
{
    scanf("%d%d%d%d",&n,&l,&x,&y);
    for (int i=1;i<=n;i++) scanf("%d",&a[i]);
    p=0; q=0;
    for (int i=1;i<=n;i++) if (bse(a,1,n,x+a[i]))
    {
        p++;
        break;
    }
    for (int i=1;i<=n;i++) if (bse(a,1,n,y+a[i]))
    {
        q++;
        break;
    }
    if (p&&q) printf("0\n");
    else if (p) printf("1\n%d\n",y);
    else if (q) printf("1\n%d\n",x);
    else
    {
        for (int i=1;i<=n;i++) if (a[i]==x+y) {p=1; break;}
        if (p) printf("1\n%d\n",x);
        else printf("2\n%d %d\n",x,y);
    }
    return 0;
}


#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int a[100005],n,l,x,y,p,q;

int bse(int a[],int l,int r,int k)
{
    if (l==r && a[l]!=k) return 0;
    int t=a[(l+r)/2];
    if (t==k) return (l+r)/2;
    else if (t<k) return bse(a,(l+r)/2+1,r,k);
    else return bse(a,l,(l+r)/2,k);
}

int main()
{
    scanf("%d%d%d%d",&n,&l,&x,&y);
    for (int i=1;i<=n;i++) scanf("%d",&a[i]);
    p=0; q=0;
    for (int i=1;i<=n;i++) if (bse(a,1,n,x+a[i]))
    {
        p++;
        break;
    }
    for (int i=1;i<=n;i++) if (bse(a,1,n,y+a[i]))
    {
        q++;
        break;
    }
    if (p&&q)
    {
        printf("0\n");
        return 0;
    }
    for (int i=1;i<=n;i++) if (bse(a,1,n,x-y+a[i]) && x+a[i]<=l)
    {
        printf("1\n%d\n",x+a[i]);
        return 0;
    }
    for (int i=1;i<=n;i++) if (bse(a,1,n,a[i]+x+y) && a[i]+x<=l)
    {
        printf("1\n%d\n",x+a[i]);
        return 0;
    }
    for (int i=1;i<=n;i++) if (bse(a,1,n,a[i]-x-y) && a[i]-x>=0)
    {
        printf("1\n%d\n",a[i]-x);
        return 0;
    }
    for (int i=1;i<=n;i++) if (bse(a,1,n,a[i]-x+y) && a[i]-x>=0)
    {
        printf("1\n%d\n",a[i]-x);
        return 0;
    }
    if (p) printf("1\n%d\n",y);
    else if (q) printf("1\n%d\n",x);
    else
    {
        for (int i=1;i<=n;i++) if (a[i]==x+y) {p=1; break;}
        if (p) printf("1\n%d\n",x);
        else printf("2\n%d %d\n",x,y);
    }
    return 0;
}


#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int a[100005],n,l,x,y,p,q;

int bse(int a[],int l,int r,int k)
{
    if (l==r && a[l]!=k) return 0;
    int t=a[(l+r)/2];
    if (t==k) return (l+r)/2;
    else if (t<k) return bse(a,(l+r)/2+1,r,k);
    else return bse(a,l,(l+r)/2,k);
}

int main()
{
    scanf("%d%d%d%d",&n,&l,&x,&y);
    for (int i=1;i<=n;i++) scanf("%d",&a[i]);
    p=0; q=0;
    for (int i=1;i<=n;i++) if (bse(a,1,n,x-y+a[i]))
    {
        printf("1\n%d\n",x+a[i]);
        return 0;
    }
    for (int i=1;i<=n;i++) if (bse(a,1,n,x+a[i]))
    {
        p++;
        break;
    }
    for (int i=1;i<=n;i++) if (bse(a,1,n,y+a[i]))
    {
        q++;
        break;
    }
    if (p&&q) printf("0\n");
    else if (p) printf("1\n%d\n",y);
    else if (q) printf("1\n%d\n",x);
    else
    {
        for (int i=1;i<=n;i++) if (a[i]==x+y) {p=1; break;}
        if (p) printf("1\n%d\n",x);
        else printf("2\n%d %d\n",x,y);
    }
    return 0;
}


#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int a[100005],n,l,x,y,p,q;

int bse(int a[],int l,int r,int k)
{
    if (l==r && a[l]!=k) return 0;
    int t=a[(l+r)/2];
    if (t==k) return (l+r)/2;
    else if (t<k) return bse(a,(l+r)/2+1,r,k);
    else return bse(a,l,(l+r)/2,k);
}

int main()
{
    scanf("%d%d%d%d",&n,&l,&x,&y);
    for (int i=1;i<=n;i++) scanf("%d",&a[i]);
    p=0; q=0;
    for (int i=1;i<=n;i++) if (bse(a,1,n,x+a[i]))
    {
        p++;
        break;
    }
    for (int i=1;i<=n;i++) if (bse(a,1,n,y+a[i]))
    {
        q++;
        break;
    }
    if (p&&q)
    {
        printf("0\n");
        return 0;
    }
    else for (int i=1;i<=n;i++) if (bse(a,1,n,x-y+a[i]))
    {
        printf("1\n%d\n",x+a[i]);
        return 0;
    }
    if (p) printf("1\n%d\n",y);
    else if (q) printf("1\n%d\n",x);
    else
    {
        for (int i=1;i<=n;i++) if (a[i]==x+y) {p=1; break;}
        if (p) printf("1\n%d\n",x);
        else printf("2\n%d %d\n",x,y);
    }
    return 0;
}


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

typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> pii;
typedef vector<pii> vii;

#define pb push_back
#define mp make_pair
#define X first
#define Y second
#define MEM(a,b) memset(a,(b),sizeof(a))
#define pr(a) cout<<#a<<" = "<<(a)<<endl
#define loop(x,a,b) for(int (x) = (a);(x)<(b);(x)++)
#define rep(x,n)   for(int (x)=0;(x)<(n);(x)++)
#define tr(c,it) for(typeof((c).begin()) it = (c).begin(); it != (c).end(); it++)
#define prc(a) tr(a, it) cout<<*(it)<<" "; cout<<endl
#define pra(a,n) for(int i=0; i<(n); i++) cout<<a[i]<<" "; cout<<endl
#define ain(a,n) int ((a)[(n)]); for(int i=0; i<(n); i++) cin>>((a)[i])
#define vin(a,n) vector<int> (a); (a).resize((n)); for(int i=0; i<(n); i++) cin>>((a)[i])
#define MOD 1000000007

int n,x,y,len,a[100100];

pii findDiff(int x,bool &flag)
{
    pii pos;
    for(int l=0,r=1; r < n;)
    {
        if(l == r)
            r += 1;
        if(a[r] - a[l] == x){
            pos.X = l;
            pos.Y = r;
            flag = true;
            break;
        }
        else if(a[r] - a[l] < x)
            r++;
        else
            l++;
    }
    return pos;
}

int main()
{
    ios::sync_with_stdio(false);
    bool f1,f2,f3,f4;
    pii pos1,pos2,pos3,pos4;
    f1 = f2 = f3 = f4 = false;
    cin>>n>>len>>x>>y;
    rep(i,n)
        cin>>a[i];
    pos1 = findDiff(x,f1);
    pos2 = findDiff(y,f2);
    pos3 = findDiff(y-x,f3);
    if(x+y <= len)
    pos4 = findDiff(x+y,f4);
    if(f1 and f2)
        cout<<"0\n";
    else if(!f1 and f2)
        cout<<"1\n"<<x<<"\n";
    else if(f1 and !f2)
        cout<<"1\n"<<y<<"\n";
    else if(!f1 and !f2)
    {
        if(f3 and a[pos3.X] >= x)
            cout<<"1\n"<<a[pos3.X] - x<<"\n";
        else if(f3 and a[pos3.Y] + x <= len)
            cout<<"1\n"<<a[pos3.Y] + x<<"\n";
        else if(f4)
            cout<<"1\n"<<a[pos4.X] + x<<"\n";
        else
            cout<<"2\n"<<x<<" "<<y<<"\n";
    }
    return 0;
}


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

typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> pii;
typedef vector<pii> vii;

#define pb push_back
#define mp make_pair
#define X first
#define Y second
#define MEM(a,b) memset(a,(b),sizeof(a))
#define pr(a) cout<<#a<<" = "<<(a)<<endl
#define loop(x,a,b) for(int (x) = (a);(x)<(b);(x)++)
#define rep(x,n)   for(int (x)=0;(x)<(n);(x)++)
#define tr(c,it) for(typeof((c).begin()) it = (c).begin(); it != (c).end(); it++)
#define prc(a) tr(a, it) cout<<*(it)<<" "; cout<<endl
#define pra(a,n) for(int i=0; i<(n); i++) cout<<a[i]<<" "; cout<<endl
#define ain(a,n) int ((a)[(n)]); for(int i=0; i<(n); i++) cin>>((a)[i])
#define vin(a,n) vector<int> (a); (a).resize((n)); for(int i=0; i<(n); i++) cin>>((a)[i])
#define MOD 1000000007

int n,x,y,len,a[100100];

pii findDiff(int x,bool &flag)
{
    pii pos;
    for(int l=0,r=1; r < n;)
    {
        if(l == r)
            r += 1;
        if(a[r] - a[l] == x){
            pos.X = l;
            pos.Y = r;
            flag = true;
            break;
        }
        else if(a[r] - a[l] < x)
            r++;
        else
            l++;
    }
    return pos;
}

int main()
{
    ios::sync_with_stdio(false);
    bool f1,f2,f3,f4;
    pii pos1,pos2,pos3,pos4;
    f1 = f2 = f3 = f4 = false;
    cin>>n>>len>>x>>y;
    rep(i,n)
        cin>>a[i];
    pos1 = findDiff(x,f1);
    pos2 = findDiff(y,f2);
    pos3 = findDiff(y-x,f3);
    if(x+y <= len)
    pos4 = findDiff(x+y,f4);
    if(f1 and f2)
        cout<<"0\n";
    else if(!f1 and f2)
        cout<<"1\n"<<x<<"\n";
    else if(f1 and !f2)
        cout<<"1\n"<<y<<"\n";
    else if(!f1 and !f2)
    {
        if(f3 and a[pos3.X] > x)
            cout<<"1\n"<<a[pos3.X] - x<<"\n";
        else if(f3 and a[pos3.Y] + x < len)
            cout<<"1\n"<<a[pos3.Y] - x<<"\n";
        else if(f4)
            cout<<"1\n"<<a[pos4.X] + x<<"\n";
        else
            cout<<"2\n"<<x<<" "<<y<<"\n";
    }
    return 0;
}


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

typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> pii;
typedef vector<pii> vii;

#define pb push_back
#define mp make_pair
#define X first
#define Y second
#define MEM(a,b) memset(a,(b),sizeof(a))
#define pr(a) cout<<#a<<" = "<<(a)<<endl
#define loop(x,a,b) for(int (x) = (a);(x)<(b);(x)++)
#define rep(x,n)   for(int (x)=0;(x)<(n);(x)++)
#define tr(c,it) for(typeof((c).begin()) it = (c).begin(); it != (c).end(); it++)
#define prc(a) tr(a, it) cout<<*(it)<<" "; cout<<endl
#define pra(a,n) for(int i=0; i<(n); i++) cout<<a[i]<<" "; cout<<endl
#define ain(a,n) int ((a)[(n)]); for(int i=0; i<(n); i++) cin>>((a)[i])
#define vin(a,n) vector<int> (a); (a).resize((n)); for(int i=0; i<(n); i++) cin>>((a)[i])
#define MOD 1000000007

int n,x,y,len,a[100100];

pii findDiff(int x,bool &flag,int state)
{
    pii pos;
    for(int l=0,r=1; r < n;)
    {
        if(l == r)
            r += 1;
        if(a[r] - a[l] == x){
            pos.X = l;
            pos.Y = r;
            flag = true;
            if(state == 1)
                break;
            else
                l++;
        }
        else if(a[r] - a[l] < x)
            r++;
        else
            l++;
    }
    return pos;
}

int main()
{
    ios::sync_with_stdio(false);
    bool f1,f2,f3,f4,f5;
    pii pos1,pos2,pos3,pos4,pos5;
    f1 = f2 = f3 = f4 = f5 = false;
    cin>>n>>len>>x>>y;
    rep(i,n)
        cin>>a[i];
    pos1 = findDiff(x,f1,0);
    pos2 = findDiff(y,f2,0);
    pos3 = findDiff(y-x,f3,0);
    pos4 = findDiff(x+y,f4,1);
    pos5 = findDiff(y-x,f5,1);
    if(f1 and f2)
        cout<<"0\n";
    else if(!f1 and f2)
        cout<<"1\n"<<x<<"\n";
    else if(f1 and !f2)
        cout<<"1\n"<<y<<"\n";
    else if(!f1 and !f2)
    {
        if(f3 and a[pos3.X] >= x)
            cout<<"1\n"<<a[pos3.X] - x<<"\n";
        else if(f4)
            cout<<"1\n"<<a[pos4.X] + x<<"\n";
        else if(f5 and a[pos5.Y] + x <= len)
            cout<<"1\n"<<a[pos5.Y] + x<<"\n";
        else
            cout<<"2\n"<<x<<" "<<y<<"\n";
    }
    return 0;
}


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

typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> pii;
typedef vector<pii> vii;

#define pb push_back
#define mp make_pair
#define X first
#define Y second
#define MEM(a,b) memset(a,(b),sizeof(a))
#define pr(a) cout<<#a<<" = "<<(a)<<endl
#define loop(x,a,b) for(int (x) = (a);(x)<(b);(x)++)
#define rep(x,n)   for(int (x)=0;(x)<(n);(x)++)
#define tr(c,it) for(typeof((c).begin()) it = (c).begin(); it != (c).end(); it++)
#define prc(a) tr(a, it) cout<<*(it)<<" "; cout<<endl
#define pra(a,n) for(int i=0; i<(n); i++) cout<<a[i]<<" "; cout<<endl
#define ain(a,n) int ((a)[(n)]); for(int i=0; i<(n); i++) cin>>((a)[i])
#define vin(a,n) vector<int> (a); (a).resize((n)); for(int i=0; i<(n); i++) cin>>((a)[i])
#define MOD 1000000007

int n,x,y,len,a[100100];

pii findDiff(int x,bool &flag)
{
    pii pos;
    for(int l=0,r=1; r < n;)
    {
        if(l == r)
            r += 1;
        if(a[r] - a[l] == x){
            pos.X = l;
            pos.Y = r;
            flag = true;
            break;
        }
        else if(a[r] - a[l] < x)
            r++;
        else
            l++;
    }
    return pos;
}

int main()
{
    ios::sync_with_stdio(false);
    bool f1,f2,f3,f4;
    pii pos1,pos2,pos3,pos4;
    f1 = f2 = f3 = f4 = false;
    cin>>n>>len>>x>>y;
    rep(i,n)
        cin>>a[i];
    pos1 = findDiff(x,f1);
    pos2 = findDiff(y,f2);
    pos3 = findDiff(y-x,f3);
    if(x+y <= len)
    pos4 = findDiff(x+y,f4);
    if(f1 and f2)
        cout<<"0\n";
    else if(!f1 and f2)
        cout<<"1\n"<<x<<"\n";
    else if(f1 and !f2)
        cout<<"1\n"<<y<<"\n";
    else if(!f1 and !f2)
    {
        if(f3 and a[pos3.X] > x)
            cout<<"1\n"<<a[pos3.X] - x<<"\n";
        else if(f3 and a[pos3.Y] + x < len)
            cout<<"1\n"<<a[pos3.Y] + x<<"\n";
        else if(f4)
            cout<<"1\n"<<a[pos4.X] + x<<"\n";
        else
            cout<<"2\n"<<x<<" "<<y<<"\n";
    }
    return 0;
}


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

typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> pii;
typedef vector<pii> vii;

#define pb push_back
#define mp make_pair
#define X first
#define Y second
#define MEM(a,b) memset(a,(b),sizeof(a))
#define pr(a) cout<<#a<<" = "<<(a)<<endl
#define loop(x,a,b) for(int (x) = (a);(x)<(b);(x)++)
#define rep(x,n)   for(int (x)=0;(x)<(n);(x)++)
#define tr(c,it) for(typeof((c).begin()) it = (c).begin(); it != (c).end(); it++)
#define prc(a) tr(a, it) cout<<*(it)<<" "; cout<<endl
#define pra(a,n) for(int i=0; i<(n); i++) cout<<a[i]<<" "; cout<<endl
#define ain(a,n) int ((a)[(n)]); for(int i=0; i<(n); i++) cin>>((a)[i])
#define vin(a,n) vector<int> (a); (a).resize((n)); for(int i=0; i<(n); i++) cin>>((a)[i])
#define MOD 1000000007

int n,x,y,len,a[100100];

pii findDiff(int x,bool &flag)
{
    pii pos;
    for(int l=0,r=1; r < n;)
    {
        if(l == r)
            r += 1;
        if(a[r] - a[l] == x){
            pos.X = l;
            pos.Y = r;
            flag = true;
            break;
        }
        else if(a[r] - a[l] < x)
            r++;
        else
            l++;
    }
    return pos;
}

int main()
{
    ios::sync_with_stdio(false);
    bool f1,f2,f3,f4;
    pii pos1,pos2,pos3,pos4;
    f1 = f2 = f3 = f4 = false;
    cin>>n>>len>>x>>y;
    rep(i,n)
        cin>>a[i];
    pos1 = findDiff(x,f1);
    pos2 = findDiff(y,f2);
    pos3 = findDiff(y-x,f3);
    if(x+y <= len)
    pos4 = findDiff(x+y,f4);
    if(f1 and f2)
        cout<<"0\n";
    else if(!f1 and f2)
        cout<<"1\n"<<x<<"\n";
    else if(f1 and !f2)
        cout<<"1\n"<<y<<"\n";
    else if(!f1 and !f2)
    {
        if(f3 and a[pos3.Y]+x < len)
            cout<<"1\n"<<a[pos3.Y] + x<<"\n";
        else if(f4)
            cout<<"1\n"<<a[pos4.X] + x<<"\n";
        else
            cout<<"2\n"<<x<<" "<<y<<"\n";
    }
    return 0;
}


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

typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> pii;
typedef vector<pii> vii;

#define pb push_back
#define mp make_pair
#define X first
#define Y second
#define MEM(a,b) memset(a,(b),sizeof(a))
#define pr(a) cout<<#a<<" = "<<(a)<<endl
#define loop(x,a,b) for(int (x) = (a);(x)<(b);(x)++)
#define rep(x,n)   for(int (x)=0;(x)<(n);(x)++)
#define tr(c,it) for(typeof((c).begin()) it = (c).begin(); it != (c).end(); it++)
#define prc(a) tr(a, it) cout<<*(it)<<" "; cout<<endl
#define pra(a,n) for(int i=0; i<(n); i++) cout<<a[i]<<" "; cout<<endl
#define ain(a,n) int ((a)[(n)]); for(int i=0; i<(n); i++) cin>>((a)[i])
#define vin(a,n) vector<int> (a); (a).resize((n)); for(int i=0; i<(n); i++) cin>>((a)[i])
#define MOD 1000000007

int n,x,y,len,a[100100];

pii findDiff(int x,bool &flag,int state)
{
    pii pos;
    for(int l=0,r=1; r < n;)
    {
        if(l == r)
            r += 1;
        if(a[r] - a[l] == x){
            pos.X = l;
            pos.Y = r;
            flag = true;
            if(state == 1)
                break;
            else
                l++;
        }
        else if(a[r] - a[l] < x)
            r++;
        else
            l++;
    }
    return pos;
}

int main()
{
    ios::sync_with_stdio(false);
    //freopen("input.txt","r",stdin);

    bool f1,f2,f3,f4;
    pii pos1,pos2,pos3,pos4;
    f1 = f2 = f3 = f4 = false;
    cin>>n>>len>>x>>y;
    rep(i,n)
        cin>>a[i];
    pos1 = findDiff(x,f1,0);
    pos2 = findDiff(y,f2,0);
    pos3 = findDiff(y-x,f3,0);
    if(x+y <= len)
    pos4 = findDiff(x+y,f4,1);
    if(f1 and f2)
        cout<<"0\n";
    else if(!f1 and f2)
        cout<<"1\n"<<x<<"\n";
    else if(f1 and !f2)
        cout<<"1\n"<<y<<"\n";
    else if(!f1 and !f2)
    {
        if(f3 and a[pos3.X] >= x)
            cout<<"1\n"<<a[pos3.X] - x<<"\n";
        else if(f3 and a[pos3.Y] + x <= len)
            cout<<"1\n"<<a[pos3.Y] + x<<"\n";
        else if(f4)
            cout<<"1\n"<<a[pos4.X] + x<<"\n";
        else
            cout<<"2\n"<<x<<" "<<y<<"\n";
    }
    return 0;
}


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

typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> pii;
typedef vector<pii> vii;

#define pb push_back
#define mp make_pair
#define X first
#define Y second
#define MEM(a,b) memset(a,(b),sizeof(a))
#define pr(a) cout<<#a<<" = "<<(a)<<endl
#define loop(x,a,b) for(int (x) = (a);(x)<(b);(x)++)
#define rep(x,n)   for(int (x)=0;(x)<(n);(x)++)
#define tr(c,it) for(typeof((c).begin()) it = (c).begin(); it != (c).end(); it++)
#define prc(a) tr(a, it) cout<<*(it)<<" "; cout<<endl
#define pra(a,n) for(int i=0; i<(n); i++) cout<<a[i]<<" "; cout<<endl
#define ain(a,n) int ((a)[(n)]); for(int i=0; i<(n); i++) cin>>((a)[i])
#define vin(a,n) vector<int> (a); (a).resize((n)); for(int i=0; i<(n); i++) cin>>((a)[i])
#define MOD 1000000007

int n,x,y,len,a[100100];

pii findDiff(int x,bool &flag)
{
    pii pos;
    for(int l=0,r=1; r < n;)
    {
        if(l == r)
            r += 1;
        if(a[r] - a[l] == x){
            pos.X = l;
            pos.Y = r;
            flag = true;
            break;
        }
        else if(a[r] - a[l] < x)
            r++;
        else
            l++;
    }
    return pos;
}

int main()
{
    ios::sync_with_stdio(false);
    bool f1,f2,f3,f4;
    pii pos1,pos2,pos3,pos4;
    f1 = f2 = f3 = f4 = false;
    cin>>n>>len>>x>>y;
    rep(i,n)
        cin>>a[i];
    pos1 = findDiff(x,f1);
    pos2 = findDiff(y,f2);
    pos3 = findDiff(y-x,f3);
    if(x+y <= len)
    pos4 = findDiff(x+y,f4);
    if(f1 and f2)
        cout<<"0\n";
    else if(!f1 and f2)
        cout<<"1\n"<<x<<"\n";
    else if(f1 and !f2)
        cout<<"1\n"<<y<<"\n";
    else if(!f1 and !f2)
    {
        if(f3)
            cout<<"1\n"<<a[pos3.Y] + x<<"\n";
        else if(f4)
            cout<<"1\n"<<a[pos4.X] + x<<"\n";
        else
            cout<<"2\n"<<x<<" "<<y<<"\n";
    }
    return 0;
}


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

typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> pii;
typedef vector<pii> vii;

#define pb push_back
#define mp make_pair
#define X first
#define Y second
#define MEM(a,b) memset(a,(b),sizeof(a))
#define pr(a) cout<<#a<<" = "<<(a)<<endl
#define loop(x,a,b) for(int (x) = (a);(x)<(b);(x)++)
#define rep(x,n)   for(int (x)=0;(x)<(n);(x)++)
#define tr(c,it) for(typeof((c).begin()) it = (c).begin(); it != (c).end(); it++)
#define prc(a) tr(a, it) cout<<*(it)<<" "; cout<<endl
#define pra(a,n) for(int i=0; i<(n); i++) cout<<a[i]<<" "; cout<<endl
#define ain(a,n) int ((a)[(n)]); for(int i=0; i<(n); i++) cin>>((a)[i])
#define vin(a,n) vector<int> (a); (a).resize((n)); for(int i=0; i<(n); i++) cin>>((a)[i])
#define MOD 1000000007

int n,x,y,len,a[100100];

pii findDiff(int x,bool &flag)
{
    pii pos;
    for(int l=0,r=1; r < n;)
    {
        if(l == r)
            r += 1;
        if(a[r] - a[l] == x){
            pos.X = l;
            pos.Y = r;
            flag = true;
            break;
        }
        else if(a[r] - a[l] < x)
            r++;
        else
            l++;
    }
    return pos;
}

int main()
{
    ios::sync_with_stdio(false);
    bool f1,f2,f3,f4;
    pii pos1,pos2,pos3,pos4;
    f1 = f2 = f3 = f4 = false;
    cin>>n>>len>>x>>y;
    rep(i,n)
        cin>>a[i];
    pos1 = findDiff(x,f1);
    pos2 = findDiff(y,f2);
    pos3 = findDiff(y-x,f3);
    if(x+y <= len)
    pos4 = findDiff(x+y,f4);
    if(f1 and f2)
        cout<<"0\n";
    else if(!f1 and f2)
        cout<<"1\n"<<x<<"\n";
    else if(f1 and !f2)
        cout<<"1\n"<<y<<"\n";
    else if(!f1 and !f2)
    {
        if(f3)
            cout<<"1\n"<<a[pos3.X] - x<<"\n";
        else if(f4)
            cout<<"1\n"<<a[pos4.X] + x<<"\n";
        else
            cout<<"2\n"<<x<<" "<<y<<"\n";
    }
    return 0;
}


#include <bits/stdc++.h>
using namespace std;
namespace my_useful_tools {
#define rep(_i, _k, _j) for(int _i = _k; _i <= _j; ++_i)
#define foreach(_i, _s) for(typeof(_s.begin()) _i = _s.begin(); _i != _s.end(); ++_i)
#define pb push_back
#define mp make_pair
#define ipir pair<int, int>
#define ivec vector<int>
#define clr(t) memset(t, 0, sizeof t)
#define pse(t, v) memset(t, v, sizeof t)
#define brl puts("")
#define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
	const int INF = 0x3f3f3f3f;
	typedef long long LL;
	typedef double DB;
	inline void pc(char c) { putchar(c); }
	template<class T> inline T gcd(T a, T b) { return b == 0 ? a : gcd(b, a % b); }
	template<class T> inline void W(T p) { if(p < 0) pc('-'), p = -p; if(p / 10 != 0) W(p / 10); pc('0' + p % 10); } // warning!! slower than printf
	template<class T> inline void Wn(T p) { W(p), brl; } template<class T> inline void W(T a, T b) { W(a), pc(' '), W(b); }
	template<class T> inline void Wn(T a, T b) { W(a), pc(' '), Wn(b); }
	template<class T> inline void W(T a, T b, T c) { W(a), pc(' '), W(b), pc(' '), W(c); }
	inline char gchar() { char ret = getchar(); for(; ret == '\n' || ret == '\r' || ret == ' '; ret = getchar()); return ret; }
	template<class T> inline void fr(T&ret) { char c = ' '; int flag = 1; for(c = getchar(); c != '-' && !('0' <= c && c <= '9'); c = getchar());
		if(c == '-') flag = -1, ret = 0; else ret = c - '0'; for(c = getchar(); '0' <= c && c <= '9'; c = getchar()) ret = ret * 10 + c - '0';
		ret = ret * flag;
	}
	inline int fr() { int x; fr(x); return x; }
	template<class T> inline void fr(T&a, T&b) { fr(a), fr(b); } template<class T> inline void fr(T&a, T&b, T&c) { fr(a), fr(b), fr(c); }
	template<class T> inline T fast_pow(T base, T index, T mod = 2147483647, T ret = 1) {
		for(; index; index >>= 1, base = base * base % mod) if(index & 1) ret = ret * base % mod;
		return ret;
	}
	const int maxv = 100, maxe = 100;
	struct Edge {
		int edge, head[maxv], to[maxe], next[maxe];
		Edge() { edge = 0; memset(head, -1, sizeof head); }
		void addedge(int u, int v) {
			to[edge] = v, next[edge] = head[u];
			head[u] = edge++;
		}
	};
};
using namespace my_useful_tools;

const int maxn = 1e5 + 100;
int n, l, x, y, d[maxn];
map<int, int> s;
int exist(int val) {
	if(s.count(val)) return val;
	rep(i, 1, n) {
		if(s.count(d[i] + val)) return d[i];
	}
	return 0;
}
int main() {
	fr(n, l, x), fr(y);
	rep(i, 1, n) fr(d[i]), s[d[i]] = i;
	if(exist(x)) {
		if(exist(y)) {
			puts("0");
			return 0;
		} else {
			printf("%d\n%d\n", 1, y);
		}
	} else if(exist(y)) {
		printf("%d\n%d\n", 1, x);
	} else {
		int num = exist(x + y);
		int pum = exist(y - x);
		if(num != 0) {
			printf("%d\n%d\n", 1, num + x);
		} else if(pum != 0 && (0 <= pum - x || pum + y <= l)) {
			if(0 <= pum - x) {
				printf("%d\n%d\n", 1, pum - x);
			} else if(pum + y <= l) {
				printf("%d\n%d\n", 1, pum + y);
			}
		} else {
			printf("%d\n%d %d\n", 2, x, y);
		}
	}

	return 0;
}


#include <bits/stdc++.h>
using namespace std;
namespace my_useful_tools {
#define rep(_i, _k, _j) for(int _i = _k; _i <= _j; ++_i)
#define foreach(_i, _s) for(typeof(_s.begin()) _i = _s.begin(); _i != _s.end(); ++_i)
#define pb push_back
#define mp make_pair
#define ipir pair<int, int>
#define ivec vector<int>
#define clr(t) memset(t, 0, sizeof t)
#define pse(t, v) memset(t, v, sizeof t)
#define brl puts("")
#define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
	const int INF = 0x3f3f3f3f;
	typedef long long LL;
	typedef double DB;
	inline void pc(char c) { putchar(c); }
	template<class T> inline T gcd(T a, T b) { return b == 0 ? a : gcd(b, a % b); }
	template<class T> inline void W(T p) { if(p < 0) pc('-'), p = -p; if(p / 10 != 0) W(p / 10); pc('0' + p % 10); } // warning!! slower than printf
	template<class T> inline void Wn(T p) { W(p), brl; } template<class T> inline void W(T a, T b) { W(a), pc(' '), W(b); }
	template<class T> inline void Wn(T a, T b) { W(a), pc(' '), Wn(b); }
	template<class T> inline void W(T a, T b, T c) { W(a), pc(' '), W(b), pc(' '), W(c); }
	inline char gchar() { char ret = getchar(); for(; ret == '\n' || ret == '\r' || ret == ' '; ret = getchar()); return ret; }
	template<class T> inline void fr(T&ret) { char c = ' '; int flag = 1; for(c = getchar(); c != '-' && !('0' <= c && c <= '9'); c = getchar());
		if(c == '-') flag = -1, ret = 0; else ret = c - '0'; for(c = getchar(); '0' <= c && c <= '9'; c = getchar()) ret = ret * 10 + c - '0';
		ret = ret * flag;
	}
	inline int fr() { int x; fr(x); return x; }
	template<class T> inline void fr(T&a, T&b) { fr(a), fr(b); } template<class T> inline void fr(T&a, T&b, T&c) { fr(a), fr(b), fr(c); }
	template<class T> inline T fast_pow(T base, T index, T mod = 2147483647, T ret = 1) {
		for(; index; index >>= 1, base = base * base % mod) if(index & 1) ret = ret * base % mod;
		return ret;
	}
	const int maxv = 100, maxe = 100;
	struct Edge {
		int edge, head[maxv], to[maxe], next[maxe];
		Edge() { edge = 0; memset(head, -1, sizeof head); }
		void addedge(int u, int v) {
			to[edge] = v, next[edge] = head[u];
			head[u] = edge++;
		}
	};
};
using namespace my_useful_tools;

const int maxn = 1e5 + 100;
int n, l, x, y, d[maxn];
map<int, int> s;
int exist(int val) {
	rep(i, 1, n) {
		if(s.count(d[i] + val) != 0) return d[i];
	}
	return -1;
}
bool cmp(const int a, const int b) {
	return b < a;
}
int main() {
	fr(n, l, x), fr(y);
	rep(i, 1, n) fr(d[i]), s[d[i]] = i;
	if(exist(x) != -1) {
		if(exist(y) != -1) {
			puts("0");
			return 0;
		} else {
			printf("%d\n%d\n", 1, y);
			return 0;
		}
	} else if(exist(y) != -1) {
		printf("%d\n%d\n", 1, x);
		return 0;
	} else {
		int pum = exist(y - x);
		sort(d + 1, d + n + 1, cmp);
		int num = exist(x + y);
		if(num != -1) {
			printf("%d\n%d\n", 1, num + x);
			return 0;
		} else if(pum != -1 && (0 <= pum - x || pum + y <= l)) {
			if(0 <= pum - x) {
				printf("%d\n%d\n", 1, pum - x);
				return 0;
			} else if(pum + y <= l) {
				printf("%d\n%d\n", 1, pum + y);
				return 0;
			}
		} else {
			printf("%d\n%d %d\n", 2, x, y);
			return 0;
		}
	}

	return 0;
}


#include <bits/stdc++.h>
using namespace std;
namespace my_useful_tools {
#define rep(_i, _k, _j) for(int _i = _k; _i <= _j; ++_i)
#define foreach(_i, _s) for(typeof(_s.begin()) _i = _s.begin(); _i != _s.end(); ++_i)
#define pb push_back
#define mp make_pair
#define ipir pair<int, int>
#define ivec vector<int>
#define clr(t) memset(t, 0, sizeof t)
#define pse(t, v) memset(t, v, sizeof t)
#define brl puts("")
#define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
	const int INF = 0x3f3f3f3f;
	typedef long long LL;
	typedef double DB;
	inline void pc(char c) { putchar(c); }
	template<class T> inline T gcd(T a, T b) { return b == 0 ? a : gcd(b, a % b); }
	template<class T> inline void W(T p) { if(p < 0) pc('-'), p = -p; if(p / 10 != 0) W(p / 10); pc('0' + p % 10); } // warning!! slower than printf
	template<class T> inline void Wn(T p) { W(p), brl; } template<class T> inline void W(T a, T b) { W(a), pc(' '), W(b); }
	template<class T> inline void Wn(T a, T b) { W(a), pc(' '), Wn(b); }
	template<class T> inline void W(T a, T b, T c) { W(a), pc(' '), W(b), pc(' '), W(c); }
	inline char gchar() { char ret = getchar(); for(; ret == '\n' || ret == '\r' || ret == ' '; ret = getchar()); return ret; }
	template<class T> inline void fr(T&ret) { char c = ' '; int flag = 1; for(c = getchar(); c != '-' && !('0' <= c && c <= '9'); c = getchar());
		if(c == '-') flag = -1, ret = 0; else ret = c - '0'; for(c = getchar(); '0' <= c && c <= '9'; c = getchar()) ret = ret * 10 + c - '0';
		ret = ret * flag;
	}
	inline int fr() { int x; fr(x); return x; }
	template<class T> inline void fr(T&a, T&b) { fr(a), fr(b); } template<class T> inline void fr(T&a, T&b, T&c) { fr(a), fr(b), fr(c); }
	template<class T> inline T fast_pow(T base, T index, T mod = 2147483647, T ret = 1) {
		for(; index; index >>= 1, base = base * base % mod) if(index & 1) ret = ret * base % mod;
		return ret;
	}
	const int maxv = 100, maxe = 100;
	struct Edge {
		int edge, head[maxv], to[maxe], next[maxe];
		Edge() { edge = 0; memset(head, -1, sizeof head); }
		void addedge(int u, int v) {
			to[edge] = v, next[edge] = head[u];
			head[u] = edge++;
		}
	};
};
using namespace my_useful_tools;

const int maxn = 1e5 + 100;
int n, l, x, y, d[maxn];
map<int, int> s;
int exist(int val) {
	rep(i, 1, n) {
		if(s.count(d[i] + val) != 0) return d[i];
	}
	return -1;
}
bool cmp(const int a, const int b) {
	return b < a;
}
int main() {
	fr(n, l, x), fr(y);
	rep(i, 1, n) fr(d[i]), s[d[i]] = i;
	if(exist(x) != -1) {
		if(exist(y) != -1) {
			puts("0");
			return 0;
		} else {
			printf("%d\n%d\n", 1, y);
			return 0;
		}
	} else if(exist(y) != -1) {
		printf("%d\n%d\n", 1, x);
		return 0;
	} else {
		int pum = exist(y - x);
		int num = exist(x + y);
		if(num != -1) {
			printf("%d\n%d\n", 1, num + x);
			return 0;
		} else if(pum != -1) {
			if(0 <= pum - x) {
				printf("%d\n%d\n", 1, pum - x);
				return 0;
			} else if(pum + y <= l) {
				printf("%d\n%d\n", 1, pum + y);
				return 0;
			}
			sort(d + 1, d + n + 1, cmp);
			pum = exist(y - x);
			if(0 <= pum - x) {
				printf("%d\n%d\n", 1, pum - x);
				return 0;
			} else if(pum + y <= l) {
				printf("%d\n%d\n", 1, pum + y);
				return 0;
			}
			printf("%d\n%d %d\n", 2, x ,y);
		} else {
			printf("%d\n%d %d\n", 2, x, y);
			return 0;
		}
	}

	return 0;
}


#include <bits/stdc++.h>
using namespace std;
namespace my_useful_tools {
#define rep(_i, _k, _j) for(int _i = _k; _i <= _j; ++_i)
#define foreach(_i, _s) for(typeof(_s.begin()) _i = _s.begin(); _i != _s.end(); ++_i)
#define pb push_back
#define mp make_pair
#define ipir pair<int, int>
#define ivec vector<int>
#define clr(t) memset(t, 0, sizeof t)
#define pse(t, v) memset(t, v, sizeof t)
#define brl puts("")
#define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
	const int INF = 0x3f3f3f3f;
	typedef long long LL;
	typedef double DB;
	inline void pc(char c) { putchar(c); }
	template<class T> inline T gcd(T a, T b) { return b == 0 ? a : gcd(b, a % b); }
	template<class T> inline void W(T p) { if(p < 0) pc('-'), p = -p; if(p / 10 != 0) W(p / 10); pc('0' + p % 10); } // warning!! slower than printf
	template<class T> inline void Wn(T p) { W(p), brl; } template<class T> inline void W(T a, T b) { W(a), pc(' '), W(b); }
	template<class T> inline void Wn(T a, T b) { W(a), pc(' '), Wn(b); }
	template<class T> inline void W(T a, T b, T c) { W(a), pc(' '), W(b), pc(' '), W(c); }
	inline char gchar() { char ret = getchar(); for(; ret == '\n' || ret == '\r' || ret == ' '; ret = getchar()); return ret; }
	template<class T> inline void fr(T&ret) { char c = ' '; int flag = 1; for(c = getchar(); c != '-' && !('0' <= c && c <= '9'); c = getchar());
		if(c == '-') flag = -1, ret = 0; else ret = c - '0'; for(c = getchar(); '0' <= c && c <= '9'; c = getchar()) ret = ret * 10 + c - '0';
		ret = ret * flag;
	}
	inline int fr() { int x; fr(x); return x; }
	template<class T> inline void fr(T&a, T&b) { fr(a), fr(b); } template<class T> inline void fr(T&a, T&b, T&c) { fr(a), fr(b), fr(c); }
	template<class T> inline T fast_pow(T base, T index, T mod = 2147483647, T ret = 1) {
		for(; index; index >>= 1, base = base * base % mod) if(index & 1) ret = ret * base % mod;
		return ret;
	}
	const int maxv = 100, maxe = 100;
	struct Edge {
		int edge, head[maxv], to[maxe], next[maxe];
		Edge() { edge = 0; memset(head, -1, sizeof head); }
		void addedge(int u, int v) {
			to[edge] = v, next[edge] = head[u];
			head[u] = edge++;
		}
	};
};
using namespace my_useful_tools;

const int maxn = 1e5 + 100;
int n, l, x, y, d[maxn];
map<int, int> s;
int exist(int val) {
	if(s.count(val)) return s[val];
	rep(i, 1, n) {
		if(s.count(d[i] + val)) return s[d[i]];
	}
	return 0;
}
int main() {
	fr(n, l, x), fr(y);
	rep(i, 1, n) fr(d[i]), s[d[i]] = i;
	if(exist(x)) {
		if(exist(y)) {
			puts("0");
			return 0;
		} else {
			printf("%d\n%d\n", 1, y);
		}
	} else if(exist(y)) {
		printf("%d\n%d\n", 1, x);
	} else {
		int num = exist(x + y);
		int pum = exist(y - x);
		if(num != 0) {
			printf("%d\n%d\n", 1, num + x);
		} else if(pum != 0 && (0 <= pum - x || pum + y <= l)) {
			if(0 <= pum - x) {
				printf("%d\n%d\n", 1, pum - x);
			} else if(pum + y <= l) {
				printf("%d\n%d\n", 1, pum + y);
			}
		} else {
			printf("%d\n%d %d\n", 2, x, y);
		}
	}

	return 0;
}


#include <bits/stdc++.h>
using namespace std;
namespace my_useful_tools {
#define rep(_i, _k, _j) for(int _i = _k; _i <= _j; ++_i)
#define foreach(_i, _s) for(typeof(_s.begin()) _i = _s.begin(); _i != _s.end(); ++_i)
#define pb push_back
#define mp make_pair
#define ipir pair<int, int>
#define ivec vector<int>
#define clr(t) memset(t, 0, sizeof t)
#define pse(t, v) memset(t, v, sizeof t)
#define brl puts("")
#define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
	const int INF = 0x3f3f3f3f;
	typedef long long LL;
	typedef double DB;
	inline void pc(char c) { putchar(c); }
	template<class T> inline T gcd(T a, T b) { return b == 0 ? a : gcd(b, a % b); }
	template<class T> inline void W(T p) { if(p < 0) pc('-'), p = -p; if(p / 10 != 0) W(p / 10); pc('0' + p % 10); } // warning!! slower than printf
	template<class T> inline void Wn(T p) { W(p), brl; } template<class T> inline void W(T a, T b) { W(a), pc(' '), W(b); }
	template<class T> inline void Wn(T a, T b) { W(a), pc(' '), Wn(b); }
	template<class T> inline void W(T a, T b, T c) { W(a), pc(' '), W(b), pc(' '), W(c); }
	inline char gchar() { char ret = getchar(); for(; ret == '\n' || ret == '\r' || ret == ' '; ret = getchar()); return ret; }
	template<class T> inline void fr(T&ret) { char c = ' '; int flag = 1; for(c = getchar(); c != '-' && !('0' <= c && c <= '9'); c = getchar());
		if(c == '-') flag = -1, ret = 0; else ret = c - '0'; for(c = getchar(); '0' <= c && c <= '9'; c = getchar()) ret = ret * 10 + c - '0';
		ret = ret * flag;
	}
	inline int fr() { int x; fr(x); return x; }
	template<class T> inline void fr(T&a, T&b) { fr(a), fr(b); } template<class T> inline void fr(T&a, T&b, T&c) { fr(a), fr(b), fr(c); }
	template<class T> inline T fast_pow(T base, T index, T mod = 2147483647, T ret = 1) {
		for(; index; index >>= 1, base = base * base % mod) if(index & 1) ret = ret * base % mod;
		return ret;
	}
	const int maxv = 100, maxe = 100;
	struct Edge {
		int edge, head[maxv], to[maxe], next[maxe];
		Edge() { edge = 0; memset(head, -1, sizeof head); }
		void addedge(int u, int v) {
			to[edge] = v, next[edge] = head[u];
			head[u] = edge++;
		}
	};
};
using namespace my_useful_tools;

const int maxn = 1e5 + 100;
int n, l, x, y, d[maxn];
map<int, int> s;
int exist(int val) {
	rep(i, 1, n) {
		if(s.count(d[i] + val) != 0) return d[i];
	}
	return -1;
}
int main() {
	fr(n, l, x), fr(y);
	rep(i, 1, n) fr(d[i]), s[d[i]] = i;
	if(exist(x) != -1) {
		if(exist(y) != -1) {
			puts("0");
			return 0;
		} else {
			printf("%d\n%d\n", 1, y);
			return 0;
		}
	} else if(exist(y) != -1) {
		printf("%d\n%d\n", 1, x);
		return 0;
	} else {
		int num = exist(x + y);
		int pum = exist(y - x);
		if(num != -1) {
			printf("%d\n%d\n", 1, num + x);
			return 0;
		} else if(pum != -1 && (0 <= pum - x || pum + y <= l)) {
			if(0 <= pum - x) {
				printf("%d\n%d\n", 1, pum - x);
				return 0;
			} else if(pum + y <= l) {
				printf("%d\n%d\n", 1, pum + y);
				return 0;
			}
		} else {
			printf("%d\n%d %d\n", 2, x, y);
			return 0;
		}
	}

	return 0;
}


#include <bits/stdc++.h>
using namespace std;
namespace my_useful_tools {
#define rep(_i, _k, _j) for(int _i = _k; _i <= _j; ++_i)
#define foreach(_i, _s) for(typeof(_s.begin()) _i = _s.begin(); _i != _s.end(); ++_i)
#define pb push_back
#define mp make_pair
#define ipir pair<int, int>
#define ivec vector<int>
#define clr(t) memset(t, 0, sizeof t)
#define pse(t, v) memset(t, v, sizeof t)
#define brl puts("")
#define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
	const int INF = 0x3f3f3f3f;
	typedef long long LL;
	typedef double DB;
	inline void pc(char c) { putchar(c); }
	template<class T> inline T gcd(T a, T b) { return b == 0 ? a : gcd(b, a % b); }
	template<class T> inline void W(T p) { if(p < 0) pc('-'), p = -p; if(p / 10 != 0) W(p / 10); pc('0' + p % 10); } // warning!! slower than printf
	template<class T> inline void Wn(T p) { W(p), brl; } template<class T> inline void W(T a, T b) { W(a), pc(' '), W(b); }
	template<class T> inline void Wn(T a, T b) { W(a), pc(' '), Wn(b); }
	template<class T> inline void W(T a, T b, T c) { W(a), pc(' '), W(b), pc(' '), W(c); }
	inline char gchar() { char ret = getchar(); for(; ret == '\n' || ret == '\r' || ret == ' '; ret = getchar()); return ret; }
	template<class T> inline void fr(T&ret) { char c = ' '; int flag = 1; for(c = getchar(); c != '-' && !('0' <= c && c <= '9'); c = getchar());
		if(c == '-') flag = -1, ret = 0; else ret = c - '0'; for(c = getchar(); '0' <= c && c <= '9'; c = getchar()) ret = ret * 10 + c - '0';
		ret = ret * flag;
	}
	inline int fr() { int x; fr(x); return x; }
	template<class T> inline void fr(T&a, T&b) { fr(a), fr(b); } template<class T> inline void fr(T&a, T&b, T&c) { fr(a), fr(b), fr(c); }
	template<class T> inline T fast_pow(T base, T index, T mod = 2147483647, T ret = 1) {
		for(; index; index >>= 1, base = base * base % mod) if(index & 1) ret = ret * base % mod;
		return ret;
	}
	const int maxv = 100, maxe = 100;
	struct Edge {
		int edge, head[maxv], to[maxe], next[maxe];
		Edge() { edge = 0; memset(head, -1, sizeof head); }
		void addedge(int u, int v) {
			to[edge] = v, next[edge] = head[u];
			head[u] = edge++;
		}
	};
};
using namespace my_useful_tools;

const int maxn = 1e5 + 100;
int n, l, x, y, d[maxn];
map<int, int> s;
int exist(int val) {
	if(s.count(val)) return val;
	rep(i, 1, n) {
		if(s.count(d[i] + val)) return d[i];
	}
	return -1;
}
int main() {
	fr(n, l, x), fr(y);
	rep(i, 1, n) fr(d[i]), s[d[i]] = i;
	if(exist(x) != -1) {
		if(exist(y) != -1) {
			puts("0");
			return 0;
		} else {
			printf("%d\n%d\n", 1, y);
			return 0;
		}
	} else if(exist(y) != -1) {
		printf("%d\n%d\n", 1, x);
	} else {
		int num = exist(x + y);
		int pum = exist(y - x);
		if(num != -1) {
			printf("%d\n%d\n", 1, num + x);
		} else if(pum != -1 && (0 <= pum - x || pum + y <= l)) {
			if(0 <= pum - x) {
				printf("%d\n%d\n", 1, pum - x);
			} else if(pum + y <= l) {
				printf("%d\n%d\n", 1, pum + y);
			}
		} else {
			printf("%d\n%d %d\n", 2, x, y);
		}
	}

	return 0;
}


#include <bits/stdc++.h>
using namespace std;
namespace my_useful_tools {
#define rep(_i, _k, _j) for(int _i = _k; _i <= _j; ++_i)
#define foreach(_i, _s) for(typeof(_s.begin()) _i = _s.begin(); _i != _s.end(); ++_i)
#define pb push_back
#define mp make_pair
#define ipir pair<int, int>
#define ivec vector<int>
#define clr(t) memset(t, 0, sizeof t)
#define pse(t, v) memset(t, v, sizeof t)
#define brl puts("")
#define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
	const int INF = 0x3f3f3f3f;
	typedef long long LL;
	typedef double DB;
	inline void pc(char c) { putchar(c); }
	template<class T> inline T gcd(T a, T b) { return b == 0 ? a : gcd(b, a % b); }
	template<class T> inline void W(T p) { if(p < 0) pc('-'), p = -p; if(p / 10 != 0) W(p / 10); pc('0' + p % 10); } // warning!! slower than printf
	template<class T> inline void Wn(T p) { W(p), brl; } template<class T> inline void W(T a, T b) { W(a), pc(' '), W(b); }
	template<class T> inline void Wn(T a, T b) { W(a), pc(' '), Wn(b); }
	template<class T> inline void W(T a, T b, T c) { W(a), pc(' '), W(b), pc(' '), W(c); }
	inline char gchar() { char ret = getchar(); for(; ret == '\n' || ret == '\r' || ret == ' '; ret = getchar()); return ret; }
	template<class T> inline void fr(T&ret) { char c = ' '; int flag = 1; for(c = getchar(); c != '-' && !('0' <= c && c <= '9'); c = getchar());
		if(c == '-') flag = -1, ret = 0; else ret = c - '0'; for(c = getchar(); '0' <= c && c <= '9'; c = getchar()) ret = ret * 10 + c - '0';
		ret = ret * flag;
	}
	inline int fr() { int x; fr(x); return x; }
	template<class T> inline void fr(T&a, T&b) { fr(a), fr(b); } template<class T> inline void fr(T&a, T&b, T&c) { fr(a), fr(b), fr(c); }
	template<class T> inline T fast_pow(T base, T index, T mod = 2147483647, T ret = 1) {
		for(; index; index >>= 1, base = base * base % mod) if(index & 1) ret = ret * base % mod;
		return ret;
	}
	const int maxv = 100, maxe = 100;
	struct Edge {
		int edge, head[maxv], to[maxe], next[maxe];
		Edge() { edge = 0; memset(head, -1, sizeof head); }
		void addedge(int u, int v) {
			to[edge] = v, next[edge] = head[u];
			head[u] = edge++;
		}
	};
};
using namespace my_useful_tools;

const int maxn = 1e5 + 100;
int n, l, x, y, d[maxn];
map<int, int> s;
int exist(int val) {
	if(s.count(val)) return val;
	rep(i, 1, n) {
		if(s.count(d[i] + val)) return d[i];
	}
	return -1;
}
int main() {
	fr(n, l, x), fr(y);
	rep(i, 1, n) fr(d[i]), s[d[i]] = i;
	if(exist(x)) {
		if(exist(y)) {
			puts("0");
			return 0;
		} else {
			printf("%d\n%d\n", 1, y);
			return 0;
		}
	} else if(exist(y)) {
		printf("%d\n%d\n", 1, x);
	} else {
		int num = exist(x + y);
		int pum = exist(y - x);
		if(num != -1) {
			printf("%d\n%d\n", 1, num + x);
		} else if(pum != -1 && (0 <= pum - x || pum + y <= l)) {
			if(0 <= pum - x) {
				printf("%d\n%d\n", 1, pum - x);
			} else if(pum + y <= l) {
				printf("%d\n%d\n", 1, pum + y);
			}
		} else {
			printf("%d\n%d %d\n", 2, x, y);
		}
	}

	return 0;
}


#include <bits/stdc++.h>
using namespace std;
namespace my_useful_tools {
#define rep(_i, _k, _j) for(int _i = _k; _i <= _j; ++_i)
#define foreach(_i, _s) for(typeof(_s.begin()) _i = _s.begin(); _i != _s.end(); ++_i)
#define pb push_back
#define mp make_pair
#define ipir pair<int, int>
#define ivec vector<int>
#define clr(t) memset(t, 0, sizeof t)
#define pse(t, v) memset(t, v, sizeof t)
#define brl puts("")
#define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
	const int INF = 0x3f3f3f3f;
	typedef long long LL;
	typedef double DB;
	inline void pc(char c) { putchar(c); }
	template<class T> inline T gcd(T a, T b) { return b == 0 ? a : gcd(b, a % b); }
	template<class T> inline void W(T p) { if(p < 0) pc('-'), p = -p; if(p / 10 != 0) W(p / 10); pc('0' + p % 10); } // warning!! slower than printf
	template<class T> inline void Wn(T p) { W(p), brl; } template<class T> inline void W(T a, T b) { W(a), pc(' '), W(b); }
	template<class T> inline void Wn(T a, T b) { W(a), pc(' '), Wn(b); }
	template<class T> inline void W(T a, T b, T c) { W(a), pc(' '), W(b), pc(' '), W(c); }
	inline char gchar() { char ret = getchar(); for(; ret == '\n' || ret == '\r' || ret == ' '; ret = getchar()); return ret; }
	template<class T> inline void fr(T&ret) { char c = ' '; int flag = 1; for(c = getchar(); c != '-' && !('0' <= c && c <= '9'); c = getchar());
		if(c == '-') flag = -1, ret = 0; else ret = c - '0'; for(c = getchar(); '0' <= c && c <= '9'; c = getchar()) ret = ret * 10 + c - '0';
		ret = ret * flag;
	}
	inline int fr() { int x; fr(x); return x; }
	template<class T> inline void fr(T&a, T&b) { fr(a), fr(b); } template<class T> inline void fr(T&a, T&b, T&c) { fr(a), fr(b), fr(c); }
	template<class T> inline T fast_pow(T base, T index, T mod = 2147483647, T ret = 1) {
		for(; index; index >>= 1, base = base * base % mod) if(index & 1) ret = ret * base % mod;
		return ret;
	}
	const int maxv = 100, maxe = 100;
	struct Edge {
		int edge, head[maxv], to[maxe], next[maxe];
		Edge() { edge = 0; memset(head, -1, sizeof head); }
		void addedge(int u, int v) {
			to[edge] = v, next[edge] = head[u];
			head[u] = edge++;
		}
	};
};
using namespace my_useful_tools;

const int maxn = 1e5 + 100;
int n, l, x, y, d[maxn];
map<int, int> s;
int exist(int val) {
	rep(i, 1, n) {
		if(s.count(d[i] + val)) return d[i];
	}
	return -1;
}
int main() {
	fr(n, l, x), fr(y);
	rep(i, 1, n) fr(d[i]), s[d[i]] = i;
	if(exist(x) != -1) {
		if(exist(y) != -1) {
			puts("0");
			return 0;
		} else {
			printf("%d\n%d\n", 1, y);
			return 0;
		}
	} else if(exist(y) != -1) {
		printf("%d\n%d\n", 1, x);
	} else {
		int num = exist(x + y);
		int pum = exist(y - x);
		if(num != -1) {
			printf("%d\n%d\n", 1, num + x);
		} else if(pum != -1 && (0 <= pum - x || pum + y <= l)) {
			if(0 <= pum - x) {
				printf("%d\n%d\n", 1, pum - x);
			} else if(pum + y <= l) {
				printf("%d\n%d\n", 1, pum + y);
			}
		} else {
			printf("%d\n%d %d\n", 2, x, y);
		}
	}

	return 0;
}


#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100000+10;

int n,l,x,y,xy;
int num[maxn],sum[maxn];

void reading()
{
	scanf("%d%d%d%d",&n,&l,&x,&y);
	for (int i=1;i<=n;i++) scanf("%d",&num[i]);
}
bool find(int x)
{
	int l=1,r=n,mid;
	while (l!=r)
	{
		mid=(l+r)/2+1;
		if (num[mid]<=x) l=mid;
		else r=mid-1;
	};
	return num[l]==x;
}
void chuli()
{
	int h1=0,h2=0,h3=0,h4=0,h5=0,ww3,ww4,ww5;
	for (int i=1;i<=n;i++)
	{
		if (find(x+num[i])) h1=1;
		if (find(y+num[i]))h2=1;
		if (find(x+y+num[i]))
		{
			h3=1;
			ww3=num[i];
		};
		if (find(y-x+num[i])&&num[i]-x>=0)
		{
			h4=1;
			ww4=num[i];
		};
		if (find(y-x+num[i])&&num[i]+y<=l)
		{
			h5=1;
			ww5=num[i];
		};
	};

	if (h1&&h2)
	{
		printf("0\n");
		exit(0);
	};
	if(!h1&&h2)
	{
		printf("1\n");
		printf("%d\n",x);
		exit(0);
	};
	if(h1&&!h2)
	{
		printf("1\n");
		printf("%d\n",y);
		exit(0);
	};
	if (h3)
	{
		printf("1\n");
		printf("%d\n",ww3+x);
		exit(0);
	};
	if (h4)
	{
		printf("1\n");
		printf("%d\n",ww4-x);
		exit(0);
	};
	if (h5)
	{
		printf("1\n");
		printf("%d\n",ww5+y);
		exit(0);
	}
	printf("2\n");
	printf("%d %d\n",x,y);
};
int main()
{
	reading();
	chuli();
	return 0;
}


#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
using namespace std;
int da[100010];
int x,y,n,l;
bool erfen(int a,int b,int c)
{
	if (a==b&&da[a]!=c)return false;
	if (da[a]==c) return true;
	if (da[b]==c)return true;
	int mid=(a+b)/2;
	if (c>da[mid])return erfen(mid+1,b,c);
	else return erfen(a,mid,c);
}
int main()
{

	scanf("%d%d%d%d",&n,&l,&x,&y);
	int ans=2,yesx=0,yesy=0;
	//printf("%d\n",x);
	for (int i=1;i<=n;i++)scanf("%d",&da[i]);
	for (int i=1;i<=n;i++)
    {
    	if (erfen(1,n,da[i]+x) )
		{
			ans-=1;
			yesx=1;
			break;
		}
    }
    for (int i=1;i<=n;i++)
    {
    	if (erfen(1,n,da[i]+y) )
		{
			ans-=1;
			yesy=1;
			break;
		}
    }
    if (ans==2)
    {
    	for (int i=1;i<=n;i++)
    	{
    		if (erfen(1,n,da[i]+y-x))
    		{

    			if (da[i]+y>l&&da[i]-x>=0)
				{
					printf("%d\n",ans-1);
					printf("%d",da[i]-x);
					exit(0);
				}
    			if (da[i]+y<=l)
    			{
    				printf("%d\n",ans-1);
    				printf("%d",da[i]+y);
    				exit(0);
    			}
    		}
    	}

    }
    if (ans==0)printf("%d\n",ans);
    if (ans==1)
	{
		printf("%d\n",ans);
		if (yesx==0)printf("%d",x);
		if (yesy==0)printf("%d",y);
	}
    if (ans==2)
	{
    	for (int i=1;i<=n;i++)
    	if (erfen(1,n,da[i]+x+y))
    	{
     		printf("1\n");
     		printf("%d",da[i]+x);
     		exit(0);
    	}
    	printf("2\n");
    	printf("%d %d",x,y);
    }
   	return 0;
}


#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int bj[100010],n,l,x,y;
bool find(int a,int b,int c)
{
	int st=a-1,en=b+1,mid;
	while(st+1 < en)
	{
		mid=(st+en)>>1;
		if(bj[mid]<=c) st=mid;
		else en=mid;
	}
	return bj[st]==c;
}
int main()
{
	scanf("%d%d%d%d",&n,&l,&x,&y);
	for(int i=1;i<=n;i++) scanf("%d",&bj[i]);
	int er=1,one=1;
	for(int i=1;i<=n;i++)
	{
		if(er&&find(i+1,n,bj[i]+y)) er=0;
		if(one&&find(i+1,n,bj[i]+x)) one=0;
	}
	printf("%d\n",er+one);
	if(one) printf("%d ",x);
	if(er) printf("%d ",y);
	return 0;
}


#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int bj[100010],n,l,x,y;
bool find(int a,int b,int c)
{
	int st=a-1,en=b+1,mid;
	while(st+1 < en)
	{
		mid=(st+en)>>1;
		if(bj[mid]<=c) st=mid;
		else en=mid;
	}
	return bj[st]==c;
}
int main()
{
	scanf("%d%d%d%d",&n,&l,&x,&y);
	for(int i=1;i<=n;i++) scanf("%d",&bj[i]);
	int er=1,one=1;
	for(int i=1;i<=n;i++)
	{
		if(find(i,n,bj[i]+y)) er=0;
		if(find(i,n,bj[i]+x)) one=0;
	}
	printf("%d\n",er+one);
	if(one) printf("%d ",x+bj[1]);
	if(er) printf("%d ",y+bj[1]);
	return 0;
}


#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n,l,x,y,a,b,c,d;
int aa[100100];

int find(int q)
{
	int j=1;
	//printf("##%d\n",q);
	for (int i=2;i<=n;i++)
	{
		while (aa[i]-aa[j]>q) j++;
		if (aa[i]-aa[j]==q) return j;
	}
	return 0;
}
int find1(int q)
{
	int j=1;
	//printf("##%d\n",q);
	for (int i=2;i<=n;i++)
	{
		while (aa[i]-aa[j]>q) j++;
		if (aa[i]-aa[j]==q)
		{

			int ll=aa[j],rr=aa[i];
			if (ll-x>0)
            	return ll-x;
    		if (rr+x<l)
    			return rr+x;
    	}
	}
	return 0;
}

int main()
{

	scanf("%d%d%d%d",&n,&l,&x,&y);

	for (int i=1;i<=n;i++)
    	scanf("%d",&aa[i]);

    a=find(x);
    b=find(y);

    if (a&&b)
    {
        printf("0");
        return 0;
    }
   // printf("##\n");
    if (a)
    {
       printf("1\n");
       printf("%d",y);
       return 0;
    }
    //printf("##\n");
    if (b)
    {
       printf("1\n");
       //printf("%d %d\n",aa[b],aa[b]+y);
       printf("%d",x);

       return 0;
    }

    if (x+y<=l)
    c=find(x+y);
    if (c)
    {
    	printf("1\n");
    	printf("%d",aa[c]+x);
    	return 0;
    }
	d=find1(y-x);
    if (d)
    {
        printf("1\n");
    	printf("%d",d);
    	return 0;
    }
    printf("2\n");
    printf("%d %d",x,y);
    return 0;
}


#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n,l,x,y,a,b,c,d;
int aa[100100];

int find(int q)
{
	int j=1;
	//printf("##%d\n",q);
	for (int i=2;i<=n;i++)
	{
		while (aa[i]-aa[j]>q) j++;
		if (aa[i]-aa[j]==q) return j;
	}
	return 0;
}
int find1(int q)
{
	int j=1;
	//printf("##%d\n",q);
	for (int i=2;i<=n;i++)
	{
		while (aa[i]-aa[j]>q) j++;
		if (aa[i]-aa[j]==q)
		{

			int ll=aa[j],rr=aa[i];
			if (ll-x>0)
            	return ll-x;
    		if (rr+x<l)
    			return rr+x;
    	}
	}
	return 0;
}

int main()
{

	scanf("%d%d%d%d",&n,&l,&x,&y);

	for (int i=1;i<=n;i++)
    	scanf("%d",&aa[i]);

    a=find(x);
    b=find(y);

    if (a&&b)
    {
        printf("0");
        return 0;
    }
   // printf("##\n");
    if (a)
    {
       printf("1\n");
       printf("%d",y);
       return 0;
    }
    //printf("##\n");
    if (b)
    {
       printf("1\n");
       printf("%d %d\n",aa[b],aa[b]+y);
       printf("%d",x);

       return 0;
    }

    if (x+y<=l)
    c=find(x+y);
    if (c)
    {
    	printf("1\n");
    	printf("%d",aa[c]+x);
    	return 0;
    }
	d=find1(y-x);
    if (d)
    {
        printf("1\n");
    	printf("%d",d);
    	return 0;
    }
    printf("2\n");
    printf("%d %d",x,y);
    return 0;
}


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <map>
using namespace std;
int n,l,x,y,k[100010];
map<int,bool>bj;
int main()
{
	scanf("%d%d%d%d",&n,&l,&x,&y);int xx=1,yy=1,zz=-1;
	for(int i=1;i<=n;i++) scanf("%d",&k[i]),bj[k[i]]=1;
	for(int i=1;i<=n;i++)
	{
		if(bj[k[i]+x]) xx=0;
		if(bj[k[i]+y]) yy=0;
		if(bj[k[i]-x+y]) if(k[i]-x>=0) zz=k[i]-x;
		if(bj[k[i]-y+x]) if(k[i]-y>=0) zz=k[i]-y;
		if(bj[k[i]-x-y]) if(k[i]-x-y>=0) zz=k[i]-x;
		if(bj[k[i]+x+y]) if(k[i]+x+y<=l) zz=k[i]+x;
	}
	int ans=xx+yy;
	if(ans==2)
	{
		if(zz!=-1) printf("1\n%d",zz);
		else printf("2\n%d %d\n",x,y);
	}
	if(ans==1)
	{
		if(yy) printf("1\n%d\n",y);
		else printf("1\n%d\n",x);
	}
	if(ans==0)
	printf("0\n");
	return 0;
}


#include <iostream>
using namespace std;
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <set>

const int maxn = 100010;
set<int> S;
int n,l,x,y,value[maxn];

int solve0()
{
    S.clear();
    for(int i=1;i<=n;i++)
        S.insert(value[i]);
    bool isokX=false,isokY=false;
    for(int i=1;i<=n&&!isokX;i++)
        if(S.find(value[i]-x)!=S.end() || S.find(value[i]+x)!=S.end())
            isokX=true;
    for(int i=1;i<=n&&!isokY;i++)
        if(S.find(value[i]-y)!=S.end() || S.find(value[i]+y)!=S.end())
            isokY=true;
    if(isokX && isokY)
        return -1;
    if(isokX)return y;
    if(isokY)return x;
    return 0;
}
int solve1()
{
    S.clear();
    for(int i=1;i<=n;i++)
    {
        if(0<=value[i]-x && value[i]-x<=l)
            S.insert(value[i]-x);

        if(0<=value[i]+x && value[i]+x<=l)
            S.insert(value[i]+x);
    }
    for(int i=1;i<=n;i++)
    {
        if(S.find(value[i]-y)!=S.end())
            return value[i]-y;
        if(S.find(value[i]+y)!=S.end())
            return value[i]+y;
    }
    return 0;
}
int main()
{
    scanf("%d%d%d%d",&n,&l,&x,&y);
    for(int i=1;i<=n;i++)
        scanf("%d",&value[i]);
    int ans=solve0();
    if(ans==-1)
    {
        cout<<0<<endl;
        return 0;
    }
    if(ans!=0)
    {
        cout<<1<<endl<<ans<<endl;
        return 0;
    }else{
        ans=solve1();
        if(ans)
        {
            cout<<1<<endl<<ans<<endl;
            return 0;
        }
    }
    cout<<2<<endl<<x<<" "<<y<<endl;

    return 0;
}


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
int bj[100010],n,l,x,y;
bool find(int a,int b,int c)
{
	int st=a-1,en=b+1,mid;
	while(st+1 < en)
	{
		mid=(st+en)>>1;
		if(bj[mid]<c) st=mid;
		else en=mid;
	}
	return bj[en]==c||bj[st]==c;
}
int main()
{
	scanf("%d%d%d%d",&n,&l,&x,&y);
	for(int i=1;i<=n;i++) scanf("%d",&bj[i]);
	int er=1,one=1;
	for(int i=1;i<=n;i++)
	{
		if(one && find(i,n,bj[i]+x)) one=0;
		if(er && find(i,n,bj[i]+y)) er=0;
	}
	printf("%d\n",er+one);
	if(one) printf("%d ",x);
	if(er) printf("%d ",y);
	return 0;
}


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
int bj[100010],n,l,x,y;
bool find(int a,int b,int c)
{
	int st=a-1,en=b+1,mid;
	while(st+1 < en)
	{
		mid=(st+en)>>1;
		if(bj[mid]==c) return 1;
		if(bj[mid]<=c) st=mid;
		else en=mid;
	}
	return bj[en]==c;
}
int main()
{
	scanf("%d%d%d%d",&n,&l,&x,&y);
	for(int i=1;i<=n;i++) scanf("%d",&bj[i]);
	int er=1,one=1;
	for(int i=1;i<=n;i++)
	{
		if(find(i,n,bj[i]+x)) one=0;
		if(find(i,n,bj[i]+y)) er=0;
	}
	printf("%d\n",er+one);
	if(one) printf("%d ",x);
	if(er) printf("%d ",y);
	return 0;
}


#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n,l,x,y,zo,yo,a,b,c,d;
int aa[100100];

int find(int a)
{
	int j=1;
	for (int i=2;i<=n;i++)
	{
		while (aa[i]-aa[j]>a) j++;
		if (aa[i]-aa[j]==a) return j;
	}
	return 0;
}
int main()
{
	scanf("%d%d%d%d",&n,&l,&x,&y);
	for (int i=1;i<=n;i++)
    	scanf("%d",&aa[i]);

    a=find(x);
    b=find(y);

    if (a&&b)
    {
        printf("0");
        return 0;
    }
    if (a)
    {
       printf("1\n");
       printf("%d",y);
       return 0;
    }
    if (b)
    {
       printf("1\n");
       printf("%d",x);
       return 0;
    }
    if (x+y<=l)
    c=find(x+y);
    d=find(y-x);
    if (c)
    {
    	printf("1\n");
    	printf("%d",aa[c]+x);
    	return 0;
    }
    int ll=aa[d],rr=aa[d]+y-x;
    if (d)
    {
    if (ll-x>0)
    {
    	printf("1\n");
    	printf("%d",ll-x);
    	return 0;
    }
    if (rr+x<l)
    {
    	printf("1\n");
    	printf("%d",rr+x);
    	return 0;
    }
    }
    printf("2\n");
    printf("%d %d",x,y);
    return 0;
}


#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n,l,x,y,a,b,c,d;
int aa[100100];

int find(int q)
{
	int j=1;
	//printf("##%d\n",q);
	for (int i=2;i<=n;i++)
	{
		while (aa[i]-aa[j]>q) j++;
		if (aa[i]-aa[j]==q) return j;
	}
	return 0;
}
int find1(int q)
{
	int j=1;
	//printf("##%d\n",q);
	for (int i=2;i<=n;i++)
	{
		while (aa[i]-aa[j]>q) j++;
		if (aa[i]-aa[j]==q)
		{
			printf("!!\n");
			int ll=aa[j],rr=aa[i];
			if (ll-x>0)
            	return ll-x;
    		if (rr+x<l)
    			return rr+x;
    	}
	}
	return 0;
}

int main()
{

//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);

	scanf("%d%d%d%d",&n,&l,&x,&y);

	for (int i=1;i<=n;i++)
    	scanf("%d",&aa[i]);

    a=find(x);
    b=find(y);

    if (a&&b)
    {
        printf("0");
        return 0;
    }
   // printf("##\n");
    if (a)
    {
       printf("1\n");
       printf("%d",y);
       return 0;
    }
    //printf("##\n");
    if (b)
    {
       printf("1\n");
       printf("%d",x);

       return 0;
    }

    if (x+y<=l)
    c=find(x+y);
    if (c)
    {
    	printf("1\n");
    	printf("%d",aa[c]+x);
    	return 0;
    }
	d=find1(y-x);
    if (d)
    {
        printf("1\n");
    	printf("%d",d);
    	return 0;
    }
    printf("2\n");
    printf("%d %d",x,y);
    return 0;
}


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <map>
using namespace std;
int n,l,x,y,k[100010];
map<int,bool>bj;
int main()
{
	scanf("%d%d%d%d",&n,&l,&x,&y);int xx=1,yy=1,zz=-1;
	for(int i=1;i<=n;i++) scanf("%d",&k[i]),bj[k[i]]=1;
	for(int i=1;i<=n;i++)
	{
		if(bj[k[i]+x]) xx=0;
		if(bj[k[i]+y]) yy=0;
		if(bj[k[i]-x+y]) if(k[i]-x>=0) zz=k[i]-x;
		if(bj[k[i]-y+x]) if(k[i]-y>=0) zz=k[i]-y;
		if(bj[k[i]+x+y]&&!bj[k[i]+x]&&!bj[k[i]+y]) if(k[i]+x+y<=l) zz=k[i]+x;
		if(bj[k[i]+x]&&bj[k[i]-y]) xx=yy=0;
		if(bj[k[i]-y]&&bj[k[i]+x]) xx=yy=0;
	}
	int ans=xx+yy;
	if(ans==2)
	{
		if(zz!=-1) printf("1\n%d",zz);
		else printf("2\n%d %d\n",x,y);
	}
	if(ans==1)
	{
		if(yy) printf("1\n%d\n",y);
		else printf("1\n%d\n",x);
	}
	if(ans==0)
	printf("0\n");
	return 0;
}


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <map>
using namespace std;
int n,l,x,y,k[100010];
map<int,bool>bj;
int main()
{
	scanf("%d%d%d%d",&n,&l,&x,&y);int xx=1,yy=1,zz=-1;
	for(int i=1;i<=n;i++) scanf("%d",&k[i]),bj[k[i]]=1;
	for(int i=1;i<=n;i++)
	{
		if(bj[k[i]+x]) xx=0;
		if(bj[k[i]+y]) yy=0;
		if(bj[k[i]+y-x]) if(k[i]+y>=0) zz=k[i]+y;
		if(bj[k[i]+x-y]) if(k[i]+x>=0) zz=k[i]+x;
		if(bj[k[i]+x+y]&&!bj[k[i]+x]&&!bj[k[i]+y]) if(k[i]+x+y<=l) zz=k[i]+x;
		if(bj[k[i]+x]&&bj[k[i]-y]) xx=yy=0;
		if(bj[k[i]-y]&&bj[k[i]+x]) xx=yy=0;
	}
	int ans=xx+yy;
	if(ans==2)
	{
		if(zz!=-1) printf("1\n%d",zz);
		else printf("2\n%d %d\n",x,y);
	}
	if(ans==1)
	{
		if(yy) printf("1\n%d\n",y);
		else printf("1\n%d\n",x);
	}
	if(ans==0)
	printf("0\n");
	return 0;
}


#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
using namespace std;
int da[100010];
int x,y,n,l;
bool erfen(int a,int b,int c)
{
	if (a==b&&da[a]!=c)return false;
	if (da[a]==c) return true;
	if (da[b]==c)return true;
	int mid=(a+b)/2;
	if (c>da[mid])return erfen(mid+1,b,c);
	else return erfen(a,mid,c);
}
int main()
{

	scanf("%d%d%d%d",&n,&l,&x,&y);
	int ans=2,yesx=0,yesy=0;
	//printf("%d\n",x);
	for (int i=1;i<=n;i++)scanf("%d",&da[i]);
	for (int i=1;i<=n;i++)
    {
    	if (erfen(1,n,da[i]+x) )
		{
			ans-=1;
			yesx=1;
			break;
		}
    }
    for (int i=1;i<=n;i++)
    {
    	if (erfen(1,n,da[i]+y) )
		{
			ans-=1;
			yesy=1;
			break;
		}
    }
    if (ans==2)
    {
    	for (int i=1;i<=n;i++)
    	{
    		if (erfen(1,n,da[i]+y-x))
    		{
    			printf("%d\n",ans-1);
    			if (da[i]+y>l) printf("%d",da[i]-x);
    			else printf("%d",da[i]+y);
    			exit(0);
    		}
    	}

    }
    if (ans==0)printf("%d\n",ans);
    if (ans==1)
	{
		printf("%d\n",ans);
		if (yesx==0)printf("%d",x);
		if (yesy==0)printf("%d",y);
	}
    if (ans==2)
	{
		if (x==y)
		{
			printf("%d\n",ans-1);
			printf("%d",x);
			exit(0);
		}
    	for (int i=1;i<=n;i++)
    	if (erfen(1,n,da[i]+x+y))
    	{

     		printf("1\n");
     		printf("%d",da[i]+x);
     		exit(0);
    	}
    	printf("2\n");
    	printf("%d %d",x,y);
    }
   	return 0;
}


#include <iostream>
using namespace std;
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <set>

const int maxn = 100010;
set<int> S;
int n,l,x,y,value[maxn];

bool solve(int n)
{
    sort(value+1,value+1+n);
    S.clear();
    for(int i=1;i<n;i++)
        S.insert(value[i+1]-value[i]);
    bool isokX=false,isokY=false;
    for(int i=1;i<=n&&!isokX;i++)
        if(value[i]==x || S.find(abs(value[i]-x))!=S.end())
            isokX=true;
    for(int i=1;i<=n&&!isokY;i++)
        if(value[i]==y || S.find(abs(value[i]-y))!=S.end())
            isokY=true;
    return isokX && isokY;
}
int main()
{
    scanf("%d%d%d%d",&n,&l,&x,&y);
    for(int i=1;i<=n;i++)
        scanf("%d",&value[i]);
    if(solve(n))
    {
        cout<<0<<endl;
        return 0;
    }
    value[n+1]=x;
    if(solve(n+1))
    {
        cout<<1<<endl<<x<<endl;
        return 0;
    }
    for(int i=1;i<=n+1;i++)
        if(value[i]==x)
    {
        value[i]=y;
        break;
    }
    if(solve(n+1))
    {
        cout<<1<<endl<<y<<endl;
        return 0;
    }
    cout<<2<<endl<<x<<" "<<y<<endl;

    return 0;
}


#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n,l,x,y,a,b,c,d;
int aa[100100];

int find(int q)
{
	int j=1;
	//printf("##%d\n",q);
	for (int i=2;i<=n;i++)
	{
		while (aa[i]-aa[j]>q) j++;
		if (aa[i]-aa[j]==q) return j;
	}
	return 0;
}
int find1(int q)
{
	int j=1;
	//printf("##%d\n",q);
	for (int i=2;i<=n;i++)
	{
		while (aa[i]-aa[j]>q) j++;
		if (aa[i]-aa[j]==q)
		{
			printf("!!\n");
			int ll=aa[j],rr=aa[i];
			if (ll-x>0)
            	return ll-x;
    		if (rr+x<l)
    			return rr+x;
    	}
	}
	return 0;
}

int main()
{

freopen("a.in","r",stdin);
freopen("a.out","w",stdout);

	scanf("%d%d%d%d",&n,&l,&x,&y);

	for (int i=1;i<=n;i++)
    	scanf("%d",&aa[i]);

    a=find(x);
    b=find(y);

    if (a&&b)
    {
        printf("0");
        return 0;
    }
   // printf("##\n");
    if (a)
    {
       printf("1\n");
       printf("%d",y);
       return 0;
    }
    //printf("##\n");
    if (b)
    {
       printf("1\n");
       printf("%d %d\n",aa[b],aa[b]+y);
       printf("%d",x);

       return 0;
    }

    if (x+y<=l)
    c=find(x+y);
    if (c)
    {
    	printf("1\n");
    	printf("%d",aa[c]+x);
    	return 0;
    }
	d=find1(y-x);
    if (d)
    {
        printf("1\n");
    	printf("%d",d);
    	return 0;
    }
    printf("2\n");
    printf("%d %d",x,y);
    return 0;
}


#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100000+10;

int n,l,x,y,xy;
int num[maxn],sum[maxn];

void reading()
{
	scanf("%d%d%d%d",&n,&l,&x,&y);
	for (int i=1;i<=n;i++) scanf("%d",&num[i]);
}
bool find(int x)
{
	int l=1,r=n,mid;
	while (l!=r)
	{
		mid=(l+r)/2+1;
		if (num[mid]<=x) l=mid;
		else r=mid-1;
	};
	return num[l]==x;
}
void chuli()
{
	int h1=0,h2=0,h3=0,h4=0,ww3,ww4;
	for (int i=1;i<=n;i++)
	{
		if (find(x+num[i])) h1=1;
		if (find(y+num[i]))h2=1;
		if (find(x+y+num[i]))
		{
			h3=1;
			ww3=num[i];
		};
		if (find(y-x+num[i]))
		{
			h4=1;
			ww4=num[i];
		}
	};

	if (h1&&h2)
	{
		printf("0\n");
		exit(0);
	};
	if(!h1&&h2)
	{
		printf("1\n");
		printf("%d\n",x);
		exit(0);
	};
	if(h1&&!h2)
	{
		printf("1\n");
		printf("%d\n",y);
		exit(0);
	};
	if (h3)
	{
		printf("1\n");
		printf("%d\n",ww3+x);
		exit(0);
	};
	if (h4)
	{
		printf("1\n");
		printf("%d\n",ww4-x);
		exit(0);
	};
	printf("2\n");
	printf("%d %d\n",x,y);
};
int main()
{
	reading();
	chuli();
	return 0;
}


#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n,l,x,y,a,b,c,d;
int aa[100100];

int find(int q)
{
	int j=1;
	//printf("##%d\n",q);
	for (int i=2;i<=n;i++)
	{
		while (aa[i]-aa[j]>q) j++;
		if (aa[i]-aa[j]==q) return j;
	}
	return 0;
}
int find1(int q)
{
	int j=1;
	//printf("##%d\n",q);
	for (int i=2;i<=n;i++)
	{
		while (aa[i]-aa[j]>q) j++;
		if (aa[i]-aa[j]==q)
		{
			printf("!!\n");
			int ll=aa[j],rr=aa[i];
			if (ll-x>0)
            	return ll-x;
    		if (rr+x<l)
    			return rr+x;
    	}
	}
	return 0;
}

int main()
{

freopen("a.in","r",stdin);
freopen("a.out","w",stdout);

	scanf("%d%d%d%d",&n,&l,&x,&y);

	for (int i=1;i<=n;i++)
    	scanf("%d",&aa[i]);

    a=find(x);
    b=find(y);

    if (a&&b)
    {
        printf("0");
        return 0;
    }
   // printf("##\n");
    if (a)
    {
       printf("1\n");
       printf("%d",y);
       return 0;
    }
    //printf("##\n");
    if (b)
    {
       printf("1\n");
       //printf("%d %d\n",aa[b],aa[b]+y);
       printf("%d",x);

       return 0;
    }

    if (x+y<=l)
    c=find(x+y);
    if (c)
    {
    	printf("1\n");
    	printf("%d",aa[c]+x);
    	return 0;
    }
	d=find1(y-x);
    if (d)
    {
        printf("1\n");
    	printf("%d",d);
    	return 0;
    }
    printf("2\n");
    printf("%d %d",x,y);
    return 0;
}


#include<iostream>
#include<cstdio>
using namespace std;
const int MaxV = 100000 + 10,fx[3]={0,1,-1};
int n,l,x,y,a[MaxV];
bool find(int x)
{
	int st=0,en=n+1,mid;
	while(st+1<en)
	{
		mid=(st+en)>>1;
		if(a[mid]>=x) en=mid;
		else st=mid;
	}
	return a[en]==x;
}
int gs,ans[15],r[15];
void solve()
{
	r[0]=5;
	if(x<y) swap(x,y);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=2;j++)
			for(int k=1;k<=2;k++)
				if(a[i]+fx[j]*x>=0&&a[i]+fx[j]*x<=l&&a[i]+fx[j]*x+fx[k]*y>=0&&a[i]+fx[j]*x+fx[k]*y<=l)
				{
					ans[0]=0;
					if(!find(a[i]+fx[j]*x)) ans[++ans[0]]=a[i]+fx[j]*x;
					if(y&&!find(a[i]+fx[j]*x+fx[k]*y)) ans[++ans[0]]=a[i]+fx[j]*x+fx[k]*y;
					if(ans[0]<r[0])
					{
						r[0]=ans[0];
						r[1]=ans[1];
						r[2]=ans[2];
					}
				}
	}
	printf("%d\n",r[0]);
	for(int i=1;i<=r[0];i++) printf("%d ",r[i]);
}
int main()
{
	scanf("%d%d%d%d",&n,&l,&x,&y);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=2;i<=n;i++)
	{
		if(find(a[i]-x)) x=0;
		if(find(a[i]-y)) y=0;
	}
	solve();
	return 0;
}


#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n,l,x,y,zo,yo,a,b,c,d;
int aa[100100];

int find(int a)
{
	int j=1;
	for (int i=2;i<=n;i++)
	{
		while (aa[i]-aa[j]>a) j++;
		if (aa[i]-aa[j]==a) return j;
	}
	return 0;
}
int main()
{
	scanf("%d%d%d%d",&n,&l,&x,&y);
	for (int i=1;i<=n;i++)
    	scanf("%d",&aa[i]);

    a=find(x);
    b=find(y);

    if (a&&b)
    {
        printf("0");
        return 0;
    }
    if (a)
    {
       printf("1\n");
       printf("%d",y);
       return 0;
    }
    if (b)
    {
       printf("1\n");
       printf("%d",x);
       return 0;
    }
    if (x+y<=l)
    c=find(x+y);
    d=find(y-x);
    if (c)
    {
    	printf("1\n");
    	printf("%d",aa[c]+x);
    	return 0;
    }
    if (d)
    {
    	printf("1\n");
    	printf("%d",aa[d]-x);
    	return 0;
    }
    printf("2\n");
    printf("%d %d",x,y);
    return 0;
}


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
int bj[100010],n,l,x,y;
bool find(int a,int b,int c)
{
	int st=a-1,en=b+1,mid;
	while(st+1 < en)
	{
		mid=(st+en)>>1;
		if(bj[mid]>=c) en=mid;
		else st=mid;
	}
	return bj[en]==c;
}
int main()
{
	scanf("%d%d%d%d",&n,&l,&x,&y);
	for(int i=1;i<=n;i++) scanf("%d",&bj[i]);
	int er=1,one=1;
	for(int i=1;i<=n;i++)
	{
		if(find(i,n,bj[i]+x)) one=0;
		if(find(i,n,bj[i]+y)) er=0;
	}
	printf("%d\n",er+one);
	if(one) printf("%d ",x);
	if(er) printf("%d ",y);
	return 0;
}


#include <iostream>
using namespace std;
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <set>

const int maxn = 100010;
set<int> S;
int n,l,x,y,value[maxn];

int solve0()
{
    S.clear();
    for(int i=1;i<=n;i++)
        S.insert(value[i]);
    bool isokX=S.find(x)!=S.end(),isokY=S.find(y)!=S.end();
    for(int i=1;i<=n&&!isokX;i++)
        if(S.find(value[i]-x)!=S.end() || S.find(value[i]+x)!=S.end())
            isokX=true;
    for(int i=1;i<=n&&!isokY;i++)
        if(S.find(value[i]-y)!=S.end() || S.find(value[i]+y)!=S.end())
            isokY=true;
    //cout<<" ---  "<<isokX<<" "<<isokY<<endl;
    if(isokX && isokY)
        return -1;
    if(isokX)return y;
    if(isokY)return x;
    return 0;
}
int solve1()
{
    S.clear();
    for(int i=1;i<=n;i++)
    {
        if(0<=value[i]-x && value[i]-x<=n)
            S.insert(value[i]-x);
        if(0<=value[i]+x && value[i]+x<=n)
            S.insert(value[i]+x);
    }
    for(int i=1;i<=n;i++)
    {
        if(S.find(value[i]-y)!=S.end())
            return value[i]-y;
        if(S.find(value[i]+y)!=S.end())
            return value[i]+y;
    }
    return 0;
}
int main()
{
    scanf("%d%d%d%d",&n,&l,&x,&y);
    for(int i=1;i<=n;i++)
        scanf("%d",&value[i]);
    int ans=solve0();
    if(ans==-1)
    {
        cout<<0<<endl;
        return 0;
    }
    if(ans!=0)
    {
        cout<<1<<endl<<ans<<endl;
        return 0;
    }else{
        ans=solve1();
        if(ans)
        {
            cout<<1<<endl<<ans<<endl;
            return 0;
        }
    }
    cout<<2<<endl<<x<<" "<<y<<endl;

    return 0;
}


#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int maxn=100100;
int n,len,x,y;
int mark[maxn],dis[maxn],que[maxn],lead,tail;
int canx,cany;

int main()
{
	scanf("%d%d%d%d",&n,&len,&x,&y);
	for (int i=1;i<=n;i++)
	{
		scanf("%d",&mark[i]);
		dis[i]=mark[i]-mark[i-1];
	}
	lead=1;tail=0;
	for (int i=1;i<=n;i++)
	{
		que[++tail]=i;
		while (lead<=tail && mark[que[tail]]-mark[que[lead]]>x) lead++;
		if (mark[que[tail]]-mark[que[lead]]==x)
		{
			canx=1;
			break;
		}
	}
	lead=1;tail=0;
	for (int i=1;i<=n;i++)
	{
		que[++tail]=i;
		while (lead<=tail && mark[que[tail]]-mark[que[lead]]>y) lead++;
		if (mark[que[tail]]-mark[que[lead]]==y)
		{
			cany=1;
			break;
		}
	}
	if (canx && cany)
	{
		cout<<0<<endl;
		return 0;
	}
	if (!canx && cany)
	{
		cout<<1<<endl;
		cout<<x<<endl;
		return 0;
	}
	if (canx && !cany)
	{
		cout<<1<<endl;
		cout<<y<<endl;
		return 0;
	}
	lead=1;tail=0;
	for (int i=1;i<=n;i++)
	{
		que[++tail]=i;
		while (lead<=tail && mark[que[tail]]-mark[que[lead]]>x+y) lead++;
		if (mark[que[tail]]-mark[que[lead]]==x+y)
		{
			cout<<1<<endl;
			cout<<mark[que[lead]]+x<<endl;
			return 0;
		}
	}
	lead=1;tail=0;
	for (int i=1;i<=n;i++)
	{
		if (mark[i]>=x) que[++tail]=i;
		while (lead<=tail && mark[que[tail]]-mark[que[lead]]>y-x) lead++;
		if (mark[que[tail]]-mark[que[lead]]==y-x)
		{
			cout<<1<<endl;
			cout<<mark[que[lead]]-x<<endl;
			return 0;
		}
	}
	cout<<2<<endl;
	cout<<x<<' '<<y<<endl;
	return 0;
}


#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int maxn=100100;
int n,len,x,y,tot;
int mark[maxn],dis[maxn],que[maxn],lead,tail;
int canx,cany;

int find(int a)
{
	if (a<0 || a>len) return 0;
	if (a==0 || a==len) return 1;
	int l,r,mid;
	l=1;r=n;mid=(l+r)>>1;
	for (;l+1<r;mid=(l+r)>>1)
	{
		if (a=mark[mid]) return 1;
		if (a>mark[mid]) l=mid;
		else r=mid;
	}
	return 0;
}

int main()
{
	scanf("%d%d%d%d",&n,&len,&x,&y);
	for (int i=1;i<=n;i++)
	{
		scanf("%d",&mark[i]);
		dis[i]=mark[i]-mark[i-1];
	}
	lead=1;tail=0;tot=0;
	for (int i=1;i<=n;i++)
	{
		que[++tail]=dis[i];
		tot+=dis[i];
		while (lead<=tail && tot>x) tot-=que[lead++];
		if (tot==x)
		{
			canx=1;
			break;
		}
	}
	lead=1;tail=0;tot=0;
	for (int i=1;i<=n;i++)
	{
		que[++tail]=dis[i];
		tot+=dis[i];
		while (lead<=tail && tot>y) tot-=que[lead++];
		if (tot==y)
		{
			cany=1;
			break;
		}
	}
	if (canx && cany)
	{
		cout<<0<<endl;
		return 0;
	}
	if (!canx && cany)
	{
		cout<<1<<endl;
		cout<<x<<endl;
		return 0;
	}
	if (canx && !cany)
	{
		cout<<1<<endl;
		cout<<y<<endl;
		return 0;
	}
	for (int i=1;i<=n;i++)
	{
		if (find(mark[i]+y+x))
		{
			cout<<1<<endl;
			cout<<mark[i]+x<<endl;
			return 0;
		}
		if (find(mark[i]-x+y))
		{
			cout<<1<<endl;
			cout<<mark[i]-x<<endl;
			return 0;
		}
	}
	cout<<2<<endl;
	cout<<x<<' '<<y<<endl;
	return 0;
}


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <map>
using namespace std;
int n,l,x,y,k[100010];
map<int,bool>bj;
int main()
{
	scanf("%d%d%d%d",&n,&l,&x,&y);int xx=1,yy=1,zz=-1;
	for(int i=1;i<=n;i++) scanf("%d",&k[i]),bj[k[i]]=1;
	for(int i=1;i<=n;i++)
	{
		if(bj[k[i]+x]) xx=0;
		if(bj[k[i]+y]) yy=0;
		if(bj[k[i]-x+y]) if(k[i]-x>=20) zz=k[i]-x;
		if(bj[k[i]-y+x]) if(k[i]-y>=0) zz=k[i]-y;
		if(bj[k[i]+x+y]) if(k[i]+x+y<=l) zz=k[i]+x;
	}
	int ans=xx+yy;
	if(ans==2)
	{
		if(zz!=-1) printf("1\n%d",zz);
		else printf("2\n%d %d\n",x,y);
	}
	if(ans==1)
	if(yy) printf("1\n%d\n",y);
	else printf("1\n%d\n",x);
	return 0;
}


#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n,l,x,y,a,b,c,d;
int aa[100100];

int find(int q)
{
	int j=1;
	//printf("##%d\n",q);
	for (int i=2;i<=n;i++)
	{
		while (aa[i]-aa[j]>q) j++;
		if (aa[i]-aa[j]==q) return j;
	}
	return 0;
}
int find1(int q)
{
	int j=1;
	//printf("##%d\n",q);
	for (int i=2;i<=n;i++)
	{
		while (aa[i]-aa[j]>q) j++;
		if (aa[i]-aa[j]==q)
		{
			printf("!!\n");
			int ll=aa[j],rr=aa[i];
			if (ll-x>0)
            	return ll-x;
    		if (rr+x<l)
    			return rr+x;
    	}
	}
	return 0;
}

int main()
{

//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);

	scanf("%d%d%d%d",&n,&l,&x,&y);

	for (int i=1;i<=n;i++)
    	scanf("%d",&aa[i]);

    a=find(x);
    b=find(y);

    if (a&&b)
    {
        printf("0");
        return 0;
    }
   // printf("##\n");
    if (a)
    {
       printf("1\n");
       printf("%d",y);
       return 0;
    }
    //printf("##\n");
    if (b)
    {
       printf("1\n");
       printf("%d %d\n",aa[b],aa[b]+y);
       printf("%d",x);

       return 0;
    }

    if (x+y<=l)
    c=find(x+y);
    if (c)
    {
    	printf("1\n");
    	printf("%d",aa[c]+x);
    	return 0;
    }
	d=find1(y-x);
    if (d)
    {
        printf("1\n");
    	printf("%d",d);
    	return 0;
    }
    printf("2\n");
    printf("%d %d",x,y);
    return 0;
}


#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
using namespace std;
int da[100010];
int x,y,n,l;
bool erfen(int a,int b,int c)
{
	if (a==b&&da[a]!=c)return false;
	if (da[a]==c) return true;
	if (da[b]==c)return true;
	int mid=(a+b)/2;
	if (c>da[mid])return erfen(mid+1,b,c);
	else return erfen(a,mid,c);
}
int main()
{

	scanf("%d%d%d%d",&n,&l,&x,&y);
	int ans=2,yesx=0,yesy=0;
	//printf("%d\n",x);
	for (int i=1;i<=n;i++)scanf("%d",&da[i]);
	for (int i=1;i<=n;i++)
    {
    	if (erfen(1,n,da[i]+x) )
		{
			ans-=1;
			yesx=1;
			break;
		}
    }
    for (int i=1;i<=n;i++)
    {
    	if (erfen(1,n,da[i]+y) )
		{
			ans-=1;
			yesy=1;
			break;
		}
    }
    if (ans==2)
    {
    	for (int i=1;i<=n;i++)
    	{
    		if (erfen(1,n,da[i]+y-x))
    		{
    			printf("%d\n",ans-1);
    			printf("%d",da[i]+y);
    			exit(0);
    		}
    	}

    }
    if (ans==0)printf("%d\n",ans);
    if (ans==1)
	{
		printf("%d\n",ans);
		if (yesx==0)printf("%d",x);
		if (yesy==0)printf("%d",y);
	}
    if (ans==2)
	{
		if (x==y)
		{
			printf("%d\n",ans-1);
			printf("%d",x);
			exit(0);
		}
    	for (int i=1;i<=n;i++)
    	if (erfen(1,n,da[i]+x+y))
    	{

     		printf("1\n");
     		printf("%d",da[i]+x);
     		exit(0);
    	}
    	printf("2\n");
    	printf("%d %d",x,y);
    }
   	return 0;
}


#include <iostream>
using namespace std;
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <set>

const int maxn = 100010;
set<int> S;
int n,l,x,y,value[maxn];

bool solve(int n)
{
    sort(value+1,value+1+n);
    S.clear();
    for(int i=1;i<n;i++)
        S.insert(value[i+1]-value[i]);
    bool isokX=false,isokY=false;
    for(int i=1;i<=n&&!isokX;i++)
        if(value[i]==x || S.find(abs(value[i]-x))!=S.end())
            isokX=true;
    for(int i=1;i<=n&&!isokY;i++)
        if(value[i]==y || S.find(abs(value[i]-y))!=S.end())
            isokY=true;
    return isokX && isokY;
}
int main()
{
    scanf("%d%d%d%d",&n,&l,&x,&y);
    for(int i=1;i<=n;i++)
        scanf("%d",&value[i]);
    if(solve(n))
    {
        cout<<0<<endl;
        return 0;
    }
    value[n+1]=x;
    if(solve(n+1))
    {
        cout<<1<<endl<<x<<endl;
        return 0;
    }
    for(int i=1;i<=n+1;i++)
        if(value[i]==x)
    {
        value[i]=y;
        break;
    }
    if(solve(n+1))
    {
        cout<<1<<endl<<y<<endl;
        return 0;
    }
    value[n+2]=x;
    if(solve(n+2))
    {
        cout<<2<<endl<<x<<" "<<y<<endl;
        return 0;
    }

    return 0;
}


#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int maxn=100100;
int n,len,x,y,tot;
int mark[maxn],dis[maxn],que[maxn],lead,tail;
int canx,cany;

int main()
{
	scanf("%d%d%d%d",&n,&len,&x,&y);
	for (int i=1;i<=n;i++)
	{
		scanf("%d",&mark[i]);
		dis[i]=mark[i]-mark[i-1];
	}
	lead=1;tail=0;tot=0;
	for (int i=1;i<=n;i++)
	{
		que[++tail]=dis[i];
		tot+=dis[i];
		while (lead<=tail && tot>x) tot-=que[lead++];
		if (tot==x)
		{
			canx=1;
			break;
		}
	}
	lead=1;tail=0;tot=0;
	for (int i=1;i<=n;i++)
	{
		que[++tail]=dis[i];
		tot+=dis[i];
		while (lead<=tail && tot>y) tot-=que[lead++];
		if (tot==y)
		{
			cany=1;
			break;
		}
	}
	if (canx && cany)
	{
		cout<<0<<endl;
		return 0;
	}
	if (!canx && cany)
	{
		cout<<1<<endl;
		cout<<x<<endl;
		return 0;
	}
	if (canx && !cany)
	{
		cout<<1<<endl;
		cout<<y<<endl;
		return 0;
	}
	lead=1;tail=0;
	for (int i=1;i<=n;i++)
	{
		que[++tail]=i;
		while (lead<=tail && mark[que[tail]]-mark[que[lead]]>x+y) lead++;
		if (mark[que[tail]]-mark[que[lead]]==x+y)
		{
			cout<<1<<endl;
			cout<<mark[que[lead]]+x<<endl;
			return 0;
		}
	}
	lead=1;tail=0;
	for (int i=1;i<=n;i++)
	{
		que[++tail]=i;
		while (lead<=tail && mark[que[lead]]<x) lead++;
		while (lead<=tail && mark[que[tail]]-mark[que[lead]]>y-x) lead++;
		if (mark[que[tail]]-mark[que[lead]]==y-x)
		{
			cout<<1<<endl;
			cout<<mark[que[lead]]-x<<endl;
			return 0;
		}
	}
	cout<<2<<endl;
	cout<<x<<' '<<y<<endl;
	return 0;
}