import java.util.ArrayList;
import java.util.Arrays;
import javax.management.RuntimeErrorException;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.Random;
import java.io.FileWriter;
import java.io.PrintWriter;
/*
    Solution Created: 17:53:28 12/08/2020
    Custom Competitive programming helper.
*/

public class Main {
	static boolean[][] visited;
	static ArrayList<Pair> ans = new ArrayList<Main.Pair>();
	static int cnt=0, n,m;
	public static void solve(Reader in, Writer out) {
		n = in.nextInt(); m = in.nextInt();
		int sx = in.nextInt(), sy = in.nextInt();
		visited = new boolean[n][m];
		dfs(sx-1,sy-1);
		if(cnt!=n*m) throw new RuntimeErrorException(null, "DAB");
		for(Pair p : ans) out.println(p.x+" "+p.y);
	}
	public static void dfs(int i, int j) {
		if(!isIn(i, j)) return;
		if(visited[i][j]) return;
		visited[i][j]= true;
		ans.add(new Pair(i+1,j+1));
		cnt++;
		dfs(i, j+1);
		dfs(i, j-1);
		dfs(i+1, j);
		dfs(i-1, j);
	}
	public static boolean isIn(int i, int j) {

		return i>=0&&j>=0&&i<n&&j<m;
	}
	static class Pair{
		int x, y;
		public Pair(int x, int y) {
			this.x = x;
			this.y = y;
		}
	}
	public static void main(String[] args) {
		Reader in = new Reader();
		Writer out = new Writer();
		solve(in, out);
		out.exit();
	}

static class Reader {
	static BufferedReader br;
	static StringTokenizer st;
	private int charIdx = 0;
	private String s;

	public Reader() {
		this.br = new BufferedReader(new InputStreamReader(System.in));
	}

	public Reader(String f){
		try {
			this.br = new BufferedReader(new FileReader(f));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public int[] na(int n) {
		int[] a = new int[n];
		for (int i = 0; i < n; i++)
			a[i] = nextInt();
		return a;
	}

	public double[] nd(int n) {
		double[] a = new double[n];
		for (int i = 0; i < n; i++)
			a[i] = nextDouble();
		return a;
	}

	public char nextChar() {
		if (s == null || charIdx >= s.length()) {
			if (st == null || !st.hasMoreTokens())
				try {
					readLine();
				} catch (Exception e) {
				}
			s = st.nextToken();
			charIdx = 0;
		}
		return s.charAt(charIdx++);
	}

	public long[] nl(int n) {
		long[] a = new long[n];
		for (int i = 0; i < n; i++)
			a[i] = nextLong();
		return a;
	}

	public char[] nca() {
		return next().toCharArray();
	}

	public String[] nS(int n) {
		String[] a = new String[n];
		for (int i = 0; i < n; i++)
			a[i] = next();
		return a;
	}

	public int nextInt() {
		if (st == null || !st.hasMoreTokens())
			try {
				readLine();
			} catch (Exception e) {
			}
		return Integer.parseInt(st.nextToken());
	}

	public double nextDouble() {
		if (st == null || !st.hasMoreTokens())
			try {
				readLine();
			} catch (Exception e) {
			}
		return Double.parseDouble(st.nextToken());
	}

	public Long nextLong() {
		if (st == null || !st.hasMoreTokens())
			try {
				readLine();
			} catch (Exception e) {
			}
		return Long.parseLong(st.nextToken());
	}

	public String next() {
		if (st == null || !st.hasMoreTokens())
			try {
				readLine();
			} catch (Exception e) {
			}
		return st.nextToken();
	}

	public static void readLine() {
		try {
			st = new StringTokenizer(br.readLine());
		} catch (Exception e) {
		}
	}
}

static class Util{
		private static Random random = new Random();
		static long[] fact;
		public static void initFactorial(int n, long mod) {
			fact = new long[n+1];
			fact[0] = 1;
			for (int i = 1; i < n+1; i++) fact[i] = (fact[i - 1] * i) % mod;
		}
		public static long modInverse(long a, long MOD) {
			long[] gcdE = gcdExtended(a, MOD);
			if (gcdE[0] != 1) return -1; // Inverted doesn't exist
			long x = gcdE[1];
			return (x % MOD + MOD) % MOD;
		}
		public static long[] gcdExtended(long p, long q) {
			if (q == 0) return new long[] { p, 1, 0 };
			long[] vals = gcdExtended(q, p % q);
			long tmp = vals[2];
			vals[2] = vals[1] - (p / q) * vals[2];
			vals[1] = tmp;
			return vals;
		}
		public static long nCr(int n, int r, long MOD) {
			if (r == 0) return 1;
			return (fact[n] * modInverse(fact[r], MOD) % MOD * modInverse(fact[n - r], MOD) % MOD) % MOD;
		}
		public static long nCr(int n, int r) {
			return (fact[n]/fact[r])/fact[n-r];
		}
		public static long nPr(int n, int r, long MOD) {
			if (r == 0) return 1;
			return (fact[n] * modInverse(fact[n - r], MOD) % MOD) % MOD;
		}
		public static long nPr(int n, int r) {
			return fact[n]/fact[n-r];
		}
		public static boolean isPrime(int n) {
	        if (n <= 1) return false;
	        if (n <= 3) return true;
	        if (n % 2 == 0 || n % 3 == 0) return false;
	        for (int i = 5; i * i <= n; i = i + 6)
	            if (n % i == 0 || n % (i + 2) == 0)
	            return false;
	        return true;
	    }
	    public static int lowerBound(int[] a, int v) {
	    	int l = 0, h = a.length;
	    	while(l<h) {
	    		int mid = (l+h)/2;
	    		if(v<=a[mid]) h = mid;
	    		else l = mid+1;
	    	}
	    	return l;
	    }
	    public static int lowerBound(long[] a, long v) {
	    	int l = 0, h = a.length;
	    	while(l<h) {
	    		int mid = (l+h)/2;
	    		if(v<=a[mid]) h = mid;
	    		else l = mid+1;
	    	}
	    	return l;
	    }
	    public static int upperBound(int[] a, int v) {
	    	int l = 0, h = a.length;
	    	while(l<h) {
	    		int mid = (l+h)/2;
	    		if(a[mid]<=v) l = mid+1;
	    		else h = mid;
	    	}
	    	return l;
	    }
	    public static int upperBound(long[] a, long v) {
	    	int l = 0, h = a.length;
	    	while(l<h) {
	    		int mid = (l+h)/2;
	    		if(a[mid]<=v) l = mid+1;
	    		else h = mid;
	    	}
	    	return l;
	    }
	    public static boolean[] getSieve(int n) {
	        boolean[] isPrime = new boolean[n+1];
	        for (int i = 2; i <= n; i++) isPrime[i] = true;
	        for (int i = 2; i*i <= n; i++) if (isPrime[i])
	                for (int j = i; i*j <= n; j++) isPrime[i*j] = false;
	        return isPrime;
	    }
	    public static int gcd(int a, int b) {
	    	int tmp = 0;
	    	while(b != 0) {
	    		tmp = b;
	    		b = a%b;
	    		a = tmp;
	    	}
	    	return a;
	    }
	    public static long gcd(long a, long b) {
	    	long tmp = 0;
	    	while(b != 0) {
	    		tmp = b;
	    		b = a%b;
	    		a = tmp;
	    	}
	    	return a;
	    }
	    public static int random(int min, int max) {
	    	return random.nextInt(max-min+1)+min;
	    }
		public static void dbg(Object... o) {
			System.out.println(Arrays.deepToString(o));
		}
		public static void reverse(int[] s, int l , int r) {
			for(int i = l; i<=(l+r)/2; i++) {
				int tmp = s[i];
				s[i] = s[r+l-i];
				s[r+l-i] = tmp;
			}
	    }
		public static void reverse(int[] s) {
			reverse(s, 0, s.length-1);
	    }
		public static void reverse(long[] s, int l , int r) {
			for(int i = l; i<=(l+r)/2; i++) {
				long tmp = s[i];
				s[i] = s[r+l-i];
				s[r+l-i] = tmp;
			}
	    }
		public static void reverse(long[] s) {
			reverse(s, 0, s.length-1);
	    }
		public static void reverse(float[] s, int l , int r) {
			for(int i = l; i<=(l+r)/2; i++) {
				float tmp = s[i];
				s[i] = s[r+l-i];
				s[r+l-i] = tmp;
			}
	    }
		public static void reverse(float[] s) {
			reverse(s, 0, s.length-1);
	    }
		public static void reverse(double[] s, int l , int r) {
			for(int i = l; i<=(l+r)/2; i++) {
				double tmp = s[i];
				s[i] = s[r+l-i];
				s[r+l-i] = tmp;
			}
	    }
		public static void reverse(double[] s) {
			reverse(s, 0, s.length-1);
	    }
		public static void reverse(char[] s, int l , int r) {
			for(int i = l; i<=(l+r)/2; i++) {
				char tmp = s[i];
				s[i] = s[r+l-i];
				s[r+l-i] = tmp;
			}
	    }
		public static void reverse(char[] s) {
			reverse(s, 0, s.length-1);
	    }
		public static <T> void reverse(T[] s, int l , int r) {
			for(int i = l; i<=(l+r)/2; i++) {
				T tmp = s[i];
				s[i] = s[r+l-i];
				s[r+l-i] = tmp;
			}
	    }
		public static <T> void reverse(T[] s) {
			reverse(s, 0, s.length-1);
	    }
		public static void shuffle(int[] s) {
	        for (int i = 0; i < s.length; ++i) {
	            int j = random.nextInt(i + 1);
	            int t = s[i];
	            s[i] = s[j];
	            s[j] = t;
	        }
	    }
	    public static void shuffle(long[] s) {
	        for (int i = 0; i < s.length; ++i) {
	            int j = random.nextInt(i + 1);
	            long t = s[i];
	            s[i] = s[j];
	            s[j] = t;
	        }
	    }
	    public static void shuffle(float[] s) {
	        for (int i = 0; i < s.length; ++i) {
	            int j = random.nextInt(i + 1);
	            float t = s[i];
	            s[i] = s[j];
	            s[j] = t;
	        }
	    }
	    public static void shuffle(double[] s) {
	        for (int i = 0; i < s.length; ++i) {
	            int j = random.nextInt(i + 1);
	            double t = s[i];
	            s[i] = s[j];
	            s[j] = t;
	        }
	    }
	    public static void shuffle(char[] s) {
	        for (int i = 0; i < s.length; ++i) {
	            int j = random.nextInt(i + 1);
	            char t = s[i];
	            s[i] = s[j];
	            s[j] = t;
	        }
	    }
	    public static <T> void shuffle(T[] s) {
	        for (int i = 0; i < s.length; ++i) {
	            int j = random.nextInt(i + 1);
	            T t = s[i];
	            s[i] = s[j];
	            s[j] = t;
	        }
	    }
		public static void sortArray(int[] a) {
	        shuffle(a);
	        Arrays.sort(a);
	    }
		public static void sortArray(long[] a) {
			shuffle(a);
	        Arrays.sort(a);
	    }
		public static void sortArray(float[] a) {
			shuffle(a);
	        Arrays.sort(a);
	    }
		public static void sortArray(double[] a) {
			shuffle(a);
	        Arrays.sort(a);
	    }
		public static void sortArray(char[] a) {
			shuffle(a);
	        Arrays.sort(a);
	    }
		public static <T extends Comparable<T>> void sortArray(T[] a) {
	        Arrays.sort(a);
	    }
	}

static class Writer {
	private PrintWriter pw;
	public Writer(){
		pw = new PrintWriter(System.out);
	}

	public Writer(String f){
		try {
			pw = new PrintWriter(new FileWriter(f));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void printArray(int[] a) {
		for(int i = 0; i<a.length; i++) print(a[i]+" ");
	}
	public void printlnArray(int[] a) {
		for(int i = 0; i<a.length; i++) print(a[i]+" ");
		pw.println();
	}
	public void printArray(long[] a) {
		for(int i = 0; i<a.length; i++) print(a[i]+" ");
	}
	public void printlnArray(long[] a) {
		for(int i = 0; i<a.length; i++) print(a[i]+" ");
		pw.println();
	}
	public void print(Object o) {
		pw.print(o.toString());
	}
	public void println(Object o) {
		pw.println(o.toString());
	}
	public void println() {
		pw.println();
	}
	public void flush() {
		pw.flush();
	}
	public void exit() {
		pw.close();
	}
}
}


import java.util.ArrayList;
import java.util.Arrays;
import javax.management.RuntimeErrorException;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.Random;
import java.io.FileWriter;
import java.io.PrintWriter;
/*
    Solution Created: 17:57:46 12/08/2020
    Custom Competitive programming helper.
*/

public class Main {
	static boolean[][] visited;
	static ArrayList<Pair> ans = new ArrayList<Main.Pair>();
	static int cnt=0, n,m;
	public static void solve(Reader in, Writer out) {
		n = in.nextInt(); m = in.nextInt();
		int sx = in.nextInt(), sy = in.nextInt();
		visited = new boolean[n][m];
		dfs(sx-1,sy-1);
		if(cnt!=n*m) throw new RuntimeErrorException(null, "DAB");
		for(Pair p : ans) out.println(p.x+" "+p.y);
	}
	public static void dfs(int i, int j) {
		visited[i][j]= true;
		ans.add(new Pair(i+1,j+1));
		cnt++;
		if(isIn(i, j+1) && !visited[i][j+1]) dfs(i, j+1);
		else if(isIn(i, j-1) && !visited[i][j-1]) dfs(i, j-1);
		else if(isIn(i+1, j) && !visited[i+1][j]) dfs(i+1, j);
		else if(isIn(i-1, j) && !visited[i-1][j]) dfs(i-1, j);
	}
	public static boolean isIn(int i, int j) {
		return i>=0&&j>=0&&i<n&&j<m;
	}
	static class Pair{
		int x, y;
		public Pair(int x, int y) {
			this.x = x;
			this.y = y;
		}
	}
	public static void main(String[] args) {
		Reader in = new Reader();
		Writer out = new Writer();
		solve(in, out);
		out.exit();
	}

static class Reader {
	static BufferedReader br;
	static StringTokenizer st;
	private int charIdx = 0;
	private String s;

	public Reader() {
		this.br = new BufferedReader(new InputStreamReader(System.in));
	}

	public Reader(String f){
		try {
			this.br = new BufferedReader(new FileReader(f));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public int[] na(int n) {
		int[] a = new int[n];
		for (int i = 0; i < n; i++)
			a[i] = nextInt();
		return a;
	}

	public double[] nd(int n) {
		double[] a = new double[n];
		for (int i = 0; i < n; i++)
			a[i] = nextDouble();
		return a;
	}

	public char nextChar() {
		if (s == null || charIdx >= s.length()) {
			if (st == null || !st.hasMoreTokens())
				try {
					readLine();
				} catch (Exception e) {
				}
			s = st.nextToken();
			charIdx = 0;
		}
		return s.charAt(charIdx++);
	}

	public long[] nl(int n) {
		long[] a = new long[n];
		for (int i = 0; i < n; i++)
			a[i] = nextLong();
		return a;
	}

	public char[] nca() {
		return next().toCharArray();
	}

	public String[] nS(int n) {
		String[] a = new String[n];
		for (int i = 0; i < n; i++)
			a[i] = next();
		return a;
	}

	public int nextInt() {
		if (st == null || !st.hasMoreTokens())
			try {
				readLine();
			} catch (Exception e) {
			}
		return Integer.parseInt(st.nextToken());
	}

	public double nextDouble() {
		if (st == null || !st.hasMoreTokens())
			try {
				readLine();
			} catch (Exception e) {
			}
		return Double.parseDouble(st.nextToken());
	}

	public Long nextLong() {
		if (st == null || !st.hasMoreTokens())
			try {
				readLine();
			} catch (Exception e) {
			}
		return Long.parseLong(st.nextToken());
	}

	public String next() {
		if (st == null || !st.hasMoreTokens())
			try {
				readLine();
			} catch (Exception e) {
			}
		return st.nextToken();
	}

	public static void readLine() {
		try {
			st = new StringTokenizer(br.readLine());
		} catch (Exception e) {
		}
	}
}

static class Util{
		private static Random random = new Random();
		static long[] fact;
		public static void initFactorial(int n, long mod) {
			fact = new long[n+1];
			fact[0] = 1;
			for (int i = 1; i < n+1; i++) fact[i] = (fact[i - 1] * i) % mod;
		}
		public static long modInverse(long a, long MOD) {
			long[] gcdE = gcdExtended(a, MOD);
			if (gcdE[0] != 1) return -1; // Inverted doesn't exist
			long x = gcdE[1];
			return (x % MOD + MOD) % MOD;
		}
		public static long[] gcdExtended(long p, long q) {
			if (q == 0) return new long[] { p, 1, 0 };
			long[] vals = gcdExtended(q, p % q);
			long tmp = vals[2];
			vals[2] = vals[1] - (p / q) * vals[2];
			vals[1] = tmp;
			return vals;
		}
		public static long nCr(int n, int r, long MOD) {
			if (r == 0) return 1;
			return (fact[n] * modInverse(fact[r], MOD) % MOD * modInverse(fact[n - r], MOD) % MOD) % MOD;
		}
		public static long nCr(int n, int r) {
			return (fact[n]/fact[r])/fact[n-r];
		}
		public static long nPr(int n, int r, long MOD) {
			if (r == 0) return 1;
			return (fact[n] * modInverse(fact[n - r], MOD) % MOD) % MOD;
		}
		public static long nPr(int n, int r) {
			return fact[n]/fact[n-r];
		}
		public static boolean isPrime(int n) {
	        if (n <= 1) return false;
	        if (n <= 3) return true;
	        if (n % 2 == 0 || n % 3 == 0) return false;
	        for (int i = 5; i * i <= n; i = i + 6)
	            if (n % i == 0 || n % (i + 2) == 0)
	            return false;
	        return true;
	    }
	    public static int lowerBound(int[] a, int v) {
	    	int l = 0, h = a.length;
	    	while(l<h) {
	    		int mid = (l+h)/2;
	    		if(v<=a[mid]) h = mid;
	    		else l = mid+1;
	    	}
	    	return l;
	    }
	    public static int lowerBound(long[] a, long v) {
	    	int l = 0, h = a.length;
	    	while(l<h) {
	    		int mid = (l+h)/2;
	    		if(v<=a[mid]) h = mid;
	    		else l = mid+1;
	    	}
	    	return l;
	    }
	    public static int upperBound(int[] a, int v) {
	    	int l = 0, h = a.length;
	    	while(l<h) {
	    		int mid = (l+h)/2;
	    		if(a[mid]<=v) l = mid+1;
	    		else h = mid;
	    	}
	    	return l;
	    }
	    public static int upperBound(long[] a, long v) {
	    	int l = 0, h = a.length;
	    	while(l<h) {
	    		int mid = (l+h)/2;
	    		if(a[mid]<=v) l = mid+1;
	    		else h = mid;
	    	}
	    	return l;
	    }
	    public static boolean[] getSieve(int n) {
	        boolean[] isPrime = new boolean[n+1];
	        for (int i = 2; i <= n; i++) isPrime[i] = true;
	        for (int i = 2; i*i <= n; i++) if (isPrime[i])
	                for (int j = i; i*j <= n; j++) isPrime[i*j] = false;
	        return isPrime;
	    }
	    public static int gcd(int a, int b) {
	    	int tmp = 0;
	    	while(b != 0) {
	    		tmp = b;
	    		b = a%b;
	    		a = tmp;
	    	}
	    	return a;
	    }
	    public static long gcd(long a, long b) {
	    	long tmp = 0;
	    	while(b != 0) {
	    		tmp = b;
	    		b = a%b;
	    		a = tmp;
	    	}
	    	return a;
	    }
	    public static int random(int min, int max) {
	    	return random.nextInt(max-min+1)+min;
	    }
		public static void dbg(Object... o) {
			System.out.println(Arrays.deepToString(o));
		}
		public static void reverse(int[] s, int l , int r) {
			for(int i = l; i<=(l+r)/2; i++) {
				int tmp = s[i];
				s[i] = s[r+l-i];
				s[r+l-i] = tmp;
			}
	    }
		public static void reverse(int[] s) {
			reverse(s, 0, s.length-1);
	    }
		public static void reverse(long[] s, int l , int r) {
			for(int i = l; i<=(l+r)/2; i++) {
				long tmp = s[i];
				s[i] = s[r+l-i];
				s[r+l-i] = tmp;
			}
	    }
		public static void reverse(long[] s) {
			reverse(s, 0, s.length-1);
	    }
		public static void reverse(float[] s, int l , int r) {
			for(int i = l; i<=(l+r)/2; i++) {
				float tmp = s[i];
				s[i] = s[r+l-i];
				s[r+l-i] = tmp;
			}
	    }
		public static void reverse(float[] s) {
			reverse(s, 0, s.length-1);
	    }
		public static void reverse(double[] s, int l , int r) {
			for(int i = l; i<=(l+r)/2; i++) {
				double tmp = s[i];
				s[i] = s[r+l-i];
				s[r+l-i] = tmp;
			}
	    }
		public static void reverse(double[] s) {
			reverse(s, 0, s.length-1);
	    }
		public static void reverse(char[] s, int l , int r) {
			for(int i = l; i<=(l+r)/2; i++) {
				char tmp = s[i];
				s[i] = s[r+l-i];
				s[r+l-i] = tmp;
			}
	    }
		public static void reverse(char[] s) {
			reverse(s, 0, s.length-1);
	    }
		public static <T> void reverse(T[] s, int l , int r) {
			for(int i = l; i<=(l+r)/2; i++) {
				T tmp = s[i];
				s[i] = s[r+l-i];
				s[r+l-i] = tmp;
			}
	    }
		public static <T> void reverse(T[] s) {
			reverse(s, 0, s.length-1);
	    }
		public static void shuffle(int[] s) {
	        for (int i = 0; i < s.length; ++i) {
	            int j = random.nextInt(i + 1);
	            int t = s[i];
	            s[i] = s[j];
	            s[j] = t;
	        }
	    }
	    public static void shuffle(long[] s) {
	        for (int i = 0; i < s.length; ++i) {
	            int j = random.nextInt(i + 1);
	            long t = s[i];
	            s[i] = s[j];
	            s[j] = t;
	        }
	    }
	    public static void shuffle(float[] s) {
	        for (int i = 0; i < s.length; ++i) {
	            int j = random.nextInt(i + 1);
	            float t = s[i];
	            s[i] = s[j];
	            s[j] = t;
	        }
	    }
	    public static void shuffle(double[] s) {
	        for (int i = 0; i < s.length; ++i) {
	            int j = random.nextInt(i + 1);
	            double t = s[i];
	            s[i] = s[j];
	            s[j] = t;
	        }
	    }
	    public static void shuffle(char[] s) {
	        for (int i = 0; i < s.length; ++i) {
	            int j = random.nextInt(i + 1);
	            char t = s[i];
	            s[i] = s[j];
	            s[j] = t;
	        }
	    }
	    public static <T> void shuffle(T[] s) {
	        for (int i = 0; i < s.length; ++i) {
	            int j = random.nextInt(i + 1);
	            T t = s[i];
	            s[i] = s[j];
	            s[j] = t;
	        }
	    }
		public static void sortArray(int[] a) {
	        shuffle(a);
	        Arrays.sort(a);
	    }
		public static void sortArray(long[] a) {
			shuffle(a);
	        Arrays.sort(a);
	    }
		public static void sortArray(float[] a) {
			shuffle(a);
	        Arrays.sort(a);
	    }
		public static void sortArray(double[] a) {
			shuffle(a);
	        Arrays.sort(a);
	    }
		public static void sortArray(char[] a) {
			shuffle(a);
	        Arrays.sort(a);
	    }
		public static <T extends Comparable<T>> void sortArray(T[] a) {
	        Arrays.sort(a);
	    }
	}

static class Writer {
	private PrintWriter pw;
	public Writer(){
		pw = new PrintWriter(System.out);
	}

	public Writer(String f){
		try {
			pw = new PrintWriter(new FileWriter(f));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void printArray(int[] a) {
		for(int i = 0; i<a.length; i++) print(a[i]+" ");
	}
	public void printlnArray(int[] a) {
		for(int i = 0; i<a.length; i++) print(a[i]+" ");
		pw.println();
	}
	public void printArray(long[] a) {
		for(int i = 0; i<a.length; i++) print(a[i]+" ");
	}
	public void printlnArray(long[] a) {
		for(int i = 0; i<a.length; i++) print(a[i]+" ");
		pw.println();
	}
	public void print(Object o) {
		pw.print(o.toString());
	}
	public void println(Object o) {
		pw.println(o.toString());
	}
	public void println() {
		pw.println();
	}
	public void flush() {
		pw.flush();
	}
	public void exit() {
		pw.close();
	}
}
}


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.TreeSet;
import javafx.scene.shape.TriangleMesh;

/**
 *
 * @author USER
 */
public class Cf {
    static class FastReader
    {
        BufferedReader br;
        StringTokenizer st;

        public FastReader()
        {
            br = new BufferedReader(new
                     InputStreamReader(System.in));
        }

        String next()
        {
            while (st == null || !st.hasMoreElements())
            {
                try
                {
                    st = new StringTokenizer(br.readLine());
                }
                catch (IOException  e)
                {
                    e.printStackTrace();
                }
            }
            return st.nextToken();
        }

        int nextInt()
        {
            return Integer.parseInt(next());
        }

        long nextLong()
        {
            return Long.parseLong(next());
        }

        double nextDouble()
        {
            return Double.parseDouble(next());
        }

        String nextLine()
        {
            String str = "";
            try
            {
                str = br.readLine();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            return str;
        }
    }

    static class BufPrint
    {
        final BufferedWriter bw;
        public BufPrint()
        {
            this.bw=new BufferedWriter(new OutputStreamWriter(System.out));
        }
        public void print(Object object)throws IOException
        {
            bw.append(""+object);
        }
        public void println(Object object)throws IOException
        {
            print(object);
            bw.append("\n");
        }
        public void close()throws IOException
        {
            bw.close();
        }
    }

        public static int GCD(int l,int r) {
        int gcd=1;
        for(int i = 1; i <= l && i <= r; ++i)
        {
            // Checks if i is factor of both integers
            if(l % i==0 && r % i==0)
                gcd = i;
        }
    return gcd;
}

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException{
        // TODO code application logic here

            FastReader sc=new FastReader();
            BufPrint bp=new BufPrint();

//            int t=sc.nextInt

//            for(int k1=0;k1<t;k1++){

                      int a=sc.nextInt();
                      int b=sc.nextInt();
                      int c=sc.nextInt();
                      int  d=sc.nextInt();
                      int x=c;
                      int y=d;
                      int x1=c;
                      int y1=d;
                      bp.println(c+" "+d);
                      for(int i=0;i<x1-1;i++)
                      {

                          if(c!=1)
                          {
                              c--;
                          }
                          bp.println(c+" "+d);
                      }
                      d--;
                      for(int i=0;i<y1-1;i++)
                      {
                          bp.println(c+" "+d);
                          if(d!=1)
                          {
                              d--;
                          }
                      }
                      d=y+1;
                      for(int i=0;i<b-y1;i++)
                      {
                          bp.println(c+" "+d);
                          if(d!=b)
                          {
                              d++;
                          }
                      }
                      c++;

                      for(int j=c;j<=a;j++){
                      for(int i=0;i<b;i++)
                      {
                          if(j<=x1 && d==y1){
                          if(j%2==0)
                          {
                              d--;
                          }
                          else{

                          d++;
                          }
                          if(d==0)
                          {
                              d=1;
                          }
                          if(d==b+1)
                          {
                              d=b;
                          }
                          }
                          else{
                          bp.println(j+" "+d);
                          if(j%2==0)
                          {
                              d--;
                          }
                          else{

                          d++;
                          }
                          if(d==0)
                          {
                              d=1;
                          }
                          if(d==b+1)
                          {
                              d=b;
                          }
                          }
//                          }
                      }
                      }
//            }

                bp.close();

    }
}


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.TreeSet;
import javafx.scene.shape.TriangleMesh;

/**
 *
 * @author USER
 */
public class Cf {
    static class FastReader
    {
        BufferedReader br;
        StringTokenizer st;

        public FastReader()
        {
            br = new BufferedReader(new
                     InputStreamReader(System.in));
        }

        String next()
        {
            while (st == null || !st.hasMoreElements())
            {
                try
                {
                    st = new StringTokenizer(br.readLine());
                }
                catch (IOException  e)
                {
                    e.printStackTrace();
                }
            }
            return st.nextToken();
        }

        int nextInt()
        {
            return Integer.parseInt(next());
        }

        long nextLong()
        {
            return Long.parseLong(next());
        }

        double nextDouble()
        {
            return Double.parseDouble(next());
        }

        String nextLine()
        {
            String str = "";
            try
            {
                str = br.readLine();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            return str;
        }
    }

    static class BufPrint
    {
        final BufferedWriter bw;
        public BufPrint()
        {
            this.bw=new BufferedWriter(new OutputStreamWriter(System.out));
        }
        public void print(Object object)throws IOException
        {
            bw.append(""+object);
        }
        public void println(Object object)throws IOException
        {
            print(object);
            bw.append("\n");
        }
        public void close()throws IOException
        {
            bw.close();
        }
    }

        public static int GCD(int l,int r) {
        int gcd=1;
        for(int i = 1; i <= l && i <= r; ++i)
        {
            // Checks if i is factor of both integers
            if(l % i==0 && r % i==0)
                gcd = i;
        }
    return gcd;
}

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException{
        // TODO code application logic here

            FastReader sc=new FastReader();
            BufPrint bp=new BufPrint();

//            int t=sc.nextInt

//            for(int k1=0;k1<t;k1++){

                      int a=sc.nextInt();
                      int b=sc.nextInt();
                      int c=sc.nextInt();
                      int  d=sc.nextInt();
                      int x=c;
                      int y=d;
                      int x1=c;
                      int y1=d;
                      bp.println(c+" "+d);
                      for(int i=0;i<x1-1;i++)
                      {

                          if(c!=1)
                          {
                              c--;
                          }
                          bp.println(c+" "+d);
                      }
                      d--;
                      for(int i=0;i<x1-1;i++)
                      {
                          bp.println(c+" "+d);
                          if(d!=1)
                          {
                              d--;
                          }
                      }
                      d=y+1;
                      for(int i=0;i<b-y1;i++)
                      {
                          bp.println(c+" "+d);
                          if(d!=b)
                          {
                              d++;
                          }
                      }
                      c++;

                      for(int j=c;j<=a;j++){
                      for(int i=0;i<b;i++)
                      {
                          if(j==x1 && d==y1){
                          if(j%2==0)
                          {
                              d--;
                          }
                          else{

                          d++;
                          }
                          }
                          else{
                          bp.println(j+" "+d);
                          if(j%2==0)
                          {
                              d--;
                          }
                          else{

                          d++;
                          }
                          if(d==0)
                          {
                              d=1;
                          }
                          if(d==b+1)
                          {
                              d=b;
                          }
                          }
//                          }
                      }
                      }
//            }

                bp.close();

    }
}


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.TreeSet;
import javafx.scene.shape.TriangleMesh;

/**
 *
 * @author USER
 */
public class Cf {
    static class FastReader
    {
        BufferedReader br;
        StringTokenizer st;

        public FastReader()
        {
            br = new BufferedReader(new
                     InputStreamReader(System.in));
        }

        String next()
        {
            while (st == null || !st.hasMoreElements())
            {
                try
                {
                    st = new StringTokenizer(br.readLine());
                }
                catch (IOException  e)
                {
                    e.printStackTrace();
                }
            }
            return st.nextToken();
        }

        int nextInt()
        {
            return Integer.parseInt(next());
        }

        long nextLong()
        {
            return Long.parseLong(next());
        }

        double nextDouble()
        {
            return Double.parseDouble(next());
        }

        String nextLine()
        {
            String str = "";
            try
            {
                str = br.readLine();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            return str;
        }
    }

    static class BufPrint
    {
        final BufferedWriter bw;
        public BufPrint()
        {
            this.bw=new BufferedWriter(new OutputStreamWriter(System.out));
        }
        public void print(Object object)throws IOException
        {
            bw.append(""+object);
        }
        public void println(Object object)throws IOException
        {
            print(object);
            bw.append("\n");
        }
        public void close()throws IOException
        {
            bw.close();
        }
    }

        public static int GCD(int l,int r) {
        int gcd=1;
        for(int i = 1; i <= l && i <= r; ++i)
        {
            // Checks if i is factor of both integers
            if(l % i==0 && r % i==0)
                gcd = i;
        }
    return gcd;
}

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException{
        // TODO code application logic here

            FastReader sc=new FastReader();
            BufPrint bp=new BufPrint();

//            int t=sc.nextInt

//            for(int k1=0;k1<t;k1++){

                      int a=sc.nextInt();
                      int b=sc.nextInt();
                      int c=sc.nextInt();
                      int  d=sc.nextInt();
                      int x=c;
                      int y=d;
                      int x1=c;
                      int y1=d;
                      bp.println(c+" "+d);
                      for(int i=0;i<x1-1;i++)
                      {

                          if(c!=1)
                          {
                              c--;
                          }
                          bp.println(c+" "+d);
                      }
                      d--;
                      for(int i=0;i<y1-1;i++)
                      {
                          bp.println(c+" "+d);
                          if(d!=1)
                          {
                              d--;
                          }
                      }
                      d=y+1;
                      for(int i=0;i<b-y1;i++)
                      {
                          bp.println(c+" "+d);
                          if(d!=b)
                          {
                              d++;
                          }
                      }
                      c++;

                      for(int j=c;j<=a;j++){
                      for(int i=0;i<b;i++)
                      {
                          if(j==x1 && d==y1){
                          if(j%2==0)
                          {
                              d--;
                          }
                          else{

                          d++;
                          }
                          }
                          else{
                          bp.println(j+" "+d);
                          if(j%2==0)
                          {
                              d--;
                          }
                          else{

                          d++;
                          }
                          if(d==0)
                          {
                              d=1;
                          }
                          if(d==b+1)
                          {
                              d=b;
                          }
                          }
//                          }
                      }
                      }
//            }

                bp.close();

    }
}


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.TreeSet;
import javafx.scene.shape.TriangleMesh;

/**
 *
 * @author USER
 */
public class Cf {
    static class FastReader
    {
        BufferedReader br;
        StringTokenizer st;

        public FastReader()
        {
            br = new BufferedReader(new
                     InputStreamReader(System.in));
        }

        String next()
        {
            while (st == null || !st.hasMoreElements())
            {
                try
                {
                    st = new StringTokenizer(br.readLine());
                }
                catch (IOException  e)
                {
                    e.printStackTrace();
                }
            }
            return st.nextToken();
        }

        int nextInt()
        {
            return Integer.parseInt(next());
        }

        long nextLong()
        {
            return Long.parseLong(next());
        }

        double nextDouble()
        {
            return Double.parseDouble(next());
        }

        String nextLine()
        {
            String str = "";
            try
            {
                str = br.readLine();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            return str;
        }
    }

    static class BufPrint
    {
        final BufferedWriter bw;
        public BufPrint()
        {
            this.bw=new BufferedWriter(new OutputStreamWriter(System.out));
        }
        public void print(Object object)throws IOException
        {
            bw.append(""+object);
        }
        public void println(Object object)throws IOException
        {
            print(object);
            bw.append("\n");
        }
        public void close()throws IOException
        {
            bw.close();
        }
    }

        public static int GCD(int l,int r) {
        int gcd=1;
        for(int i = 1; i <= l && i <= r; ++i)
        {
            // Checks if i is factor of both integers
            if(l % i==0 && r % i==0)
                gcd = i;
        }
    return gcd;
}

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException{
        // TODO code application logic here

            FastReader sc=new FastReader();
            BufPrint bp=new BufPrint();

//            int t=sc.nextInt

//            for(int k1=0;k1<t;k1++){

                      int a=sc.nextInt();
                      int b=sc.nextInt();
                      int c=sc.nextInt();
                      int  d=sc.nextInt();
                      int x=c;
                      int y=d;
                      int x1=c;
                      int y1=d;
                      bp.println(c+" "+d);
                      for(int i=0;i<x1-1;i++)
                      {

                          if(c!=1)
                          {
                              c--;
                          }
                          bp.println(c+" "+d);
                      }
                      d--;
                      for(int i=0;i<y1-1;i++)
                      {
                          bp.println(c+" "+d);
                          if(d!=1)
                          {
                              d--;
                          }
                      }
                      d=y+1;
                      for(int i=0;i<a-y1;i++)
                      {
                          bp.println(c+" "+d);
                          if(d!=a)
                          {
                              d++;
                          }
                      }
                      c++;

                      for(int j=c;j<=b;j++){
                      for(int i=0;i<a;i++)
                      {
                          if(j==x1 && d==y1){
                          if(j%2==0)
                          {
                              d--;
                          }
                          else{

                          d++;
                          }
                          }
                          else{
                          bp.println(j+" "+d);
                          if(j%2==0)
                          {
                              d--;
                          }
                          else{

                          d++;
                          }
                          if(d==0)
                          {
                              d=1;
                          }
                          if(d==a+1)
                          {
                              d=a;
                          }
                          }
//                          }
                      }
                      }
//            }

                bp.close();

    }
}


import java.io.OutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Arrays;
import java.io.BufferedWriter;
import java.io.Writer;
import java.io.OutputStreamWriter;
import java.util.InputMismatchException;
import java.io.IOException;
import java.io.InputStream;

/**
 * Built using CHelper plug-in
 * Actual solution is at the top
 */
public class Main {
    public static void main(String[] args) {
        InputStream inputStream = System.in;
        OutputStream outputStream = System.out;
        InputReader in = new InputReader(inputStream);
        OutputWriter out = new OutputWriter(outputStream);
        TaskB solver = new TaskB();
        solver.solve(1, in, out);
        out.close();
    }

    static class TaskB {
        public void solve(int testNumber, InputReader in, OutputWriter out) {
            int m = in.nextInt(), n = in.nextInt(), Sx = in.nextInt(), Sy = in.nextInt();
            boolean[][] arr = new boolean[m][n];
            for (boolean[] a : arr
            ) {
                Arrays.fill(a, false);
            }
            Sx--;
            Sy--;
            for (int i = Sy; i < n; i++) {
                if (!arr[Sx][i]) {
                    System.out.println((Sx + 1) + " " + (i + 1));
                    arr[Sx][i] = true;

                }
            }

            for (int i = Sy; i >= 0; i--) {
                if (!arr[Sx][i]) {
                    System.out.println((Sx + 1) + " " + (i + 1));
                    arr[Sx][i] = true;
                }
            }
            int x = 0, y = 0;

            int i, k = x, l = y;
            while (k < m && l < n) {
                for (i = l; i < n; ++i) {
                    if (!arr[k][i]) {
                        arr[k][i] = true;
                        System.out.println((k + 1) + " " + (i + 1));
                    }
                }
                k++;

                for (i = k; i < m; ++i) {
                    if (!arr[i][n - 1]) {
                        System.out.println((i + 1) + " " + n);
                        arr[i][n - 1] = true;
                    }
                }
                n--;

                if (k < m) {
                    for (i = n - 1; i >= l; --i) {
                        if (!arr[m - 1][i]) {
                            arr[m - 1][i] = true;
                            System.out.println(m + " " + (i + 1));
                        }
                    }
                    m--;
                }

                if (l < n) {
                    for (i = m - 1; i >= k; --i) {
                        if (!arr[i][l]) {
                            arr[i][l] = true;
                            System.out.println((i + 1) + " " + (l + 1));
                        }
                    }
                    l++;
                }
            }
        }

    }

    static class OutputWriter {
        private final PrintWriter writer;

        public OutputWriter(OutputStream outputStream) {
            writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(outputStream)));
        }

        public OutputWriter(Writer writer) {
            this.writer = new PrintWriter(writer);
        }

        public void close() {
            writer.close();
        }

    }

    static class InputReader {
        private InputStream stream;
        private byte[] buf = new byte[1024];
        private int curChar;
        private int numChars;
        private InputReader.SpaceCharFilter filter;

        public InputReader(InputStream stream) {
            this.stream = stream;
        }

        public int read() {
            if (numChars == -1) {
                throw new InputMismatchException();
            }
            if (curChar >= numChars) {
                curChar = 0;
                try {
                    numChars = stream.read(buf);
                } catch (IOException e) {
                    throw new InputMismatchException();
                }
                if (numChars <= 0) {
                    return -1;
                }
            }
            return buf[curChar++];
        }

        public int nextInt() {
            int c = read();
            while (isSpaceChar(c)) {
                c = read();
            }
            int sgn = 1;
            if (c == '-') {
                sgn = -1;
                c = read();
            }
            int res = 0;
            do {
                if (c < '0' || c > '9') {
                    throw new InputMismatchException();
                }
                res *= 10;
                res += c - '0';
                c = read();
            } while (!isSpaceChar(c));
            return res * sgn;
        }

        public boolean isSpaceChar(int c) {
            if (filter != null) {
                return filter.isSpaceChar(c);
            }
            return isWhitespace(c);
        }

        public static boolean isWhitespace(int c) {
            return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
        }

        public interface SpaceCharFilter {
            public boolean isSpaceChar(int ch);

        }

    }
}


import java.io.OutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Arrays;
import java.io.BufferedWriter;
import java.io.Writer;
import java.io.OutputStreamWriter;
import java.util.InputMismatchException;
import java.io.IOException;
import java.io.InputStream;

/**
 * Built using CHelper plug-in
 * Actual solution is at the top
 */
public class Main {
    public static void main(String[] args) {
        InputStream inputStream = System.in;
        OutputStream outputStream = System.out;
        InputReader in = new InputReader(inputStream);
        OutputWriter out = new OutputWriter(outputStream);
        TaskB solver = new TaskB();
        solver.solve(1, in, out);
        out.close();
    }

    static class TaskB {
        public void solve(int testNumber, InputReader in, OutputWriter out) {
            int m = in.nextInt(), n = in.nextInt(), Sx = in.nextInt(), Sy = in.nextInt();
            boolean[][] arr = new boolean[m][n];
            for (boolean[] a : arr
            ) {
                Arrays.fill(a, false);
            }
            Sx--;
            Sy--;
            int x = Sx, y = Sy;
            for (int i = Sx; i >= 0; i--) {
                if (!arr[i][y]) {
                    System.out.println((i + 1) + " " + (y + 1));
                    arr[i][y] = true;
                    if (x != 0)
                        x--;
                }
            }

            for (int i = y; i >= 0; i--) {
                if (!arr[x][i]) {
                    System.out.println((x + 1) + " " + (i + 1));
                    arr[x][i] = true;
                    if (y != 0) {
                        y--;
                    }
                }
            }

            int i, k = x, l = y;
            while (k < m && l < n) {
                for (i = l; i < n; ++i) {
                    if (!arr[k][i]) {
                        arr[k][i] = true;
                        System.out.println((k + 1) + " " + (i + 1));
                    }
                }
                k++;

                for (i = k; i < m; ++i) {
                    if (!arr[i][n - 1]) {
                        System.out.println((i + 1) + " " + n);
                        arr[i][n - 1] = true;
                    }
                }
                n--;

                if (k < m) {
                    for (i = n - 1; i >= l; --i) {
                        if (!arr[m - 1][i]) {
                            arr[m - 1][i] = true;
                            System.out.println(m + " " + (i + 1));
                        }
                    }
                    m--;
                }

                if (l < n) {
                    for (i = m - 1; i >= k; --i) {
                        if (!arr[i][l]) {
                            arr[i][l] = true;
                            System.out.println((i + 1) + " " + (l + 1));
                        }
                    }
                    l++;
                }
            }
        }

    }

    static class OutputWriter {
        private final PrintWriter writer;

        public OutputWriter(OutputStream outputStream) {
            writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(outputStream)));
        }

        public OutputWriter(Writer writer) {
            this.writer = new PrintWriter(writer);
        }

        public void close() {
            writer.close();
        }

    }

    static class InputReader {
        private InputStream stream;
        private byte[] buf = new byte[1024];
        private int curChar;
        private int numChars;
        private InputReader.SpaceCharFilter filter;

        public InputReader(InputStream stream) {
            this.stream = stream;
        }

        public int read() {
            if (numChars == -1) {
                throw new InputMismatchException();
            }
            if (curChar >= numChars) {
                curChar = 0;
                try {
                    numChars = stream.read(buf);
                } catch (IOException e) {
                    throw new InputMismatchException();
                }
                if (numChars <= 0) {
                    return -1;
                }
            }
            return buf[curChar++];
        }

        public int nextInt() {
            int c = read();
            while (isSpaceChar(c)) {
                c = read();
            }
            int sgn = 1;
            if (c == '-') {
                sgn = -1;
                c = read();
            }
            int res = 0;
            do {
                if (c < '0' || c > '9') {
                    throw new InputMismatchException();
                }
                res *= 10;
                res += c - '0';
                c = read();
            } while (!isSpaceChar(c));
            return res * sgn;
        }

        public boolean isSpaceChar(int c) {
            if (filter != null) {
                return filter.isSpaceChar(c);
            }
            return isWhitespace(c);
        }

        public static boolean isWhitespace(int c) {
            return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
        }

        public interface SpaceCharFilter {
            public boolean isSpaceChar(int ch);

        }

    }
}


import java.io.*;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;
import static java.lang.Math.PI;
import static java.lang.System.in;
import static java.lang.System.out;

public class B
{
    static int n,m;
    static boolean vis[][];
    static int dx[] = {0, 0};
    static int dy[] = {1,-1};

    static boolean isValid(int x, int y)
    {
        if(x > n || x < 1 || y > m || y < 1)
            return false;
        return true;
    }
    static boolean onBorder(int x, int y)
    {
        if(y == 1 || y == m)
            return true;
        return false;
    }

    static void dfs(int x, int y, PrintWriter p)
    {
        vis[x][y] = true;
        p.println(x +" " + y);
        for(int i = 0; i < 2; i++)
        {
            int X = x + dx[i];
            int Y = y + dy[i];
            if(isValid(X, Y) && !vis[X][Y])
                dfs(X, Y, p);
        }
        if(onBorder(x,y))
        {
            for(int i = 1; i <= n; i++)
            {
                if(!vis[i][y])
                    dfs(i,y,p);
            }
        }

    }

    public static void main(String [] args) throws Exception
    {
        Foster sc = new Foster();
        PrintWriter p = new PrintWriter(out);
        n = sc.nextInt();
        m = sc.nextInt();
        int x = sc.nextInt(), y = sc.nextInt();
        vis = new boolean[n+1][m+1];
        dfs(x,y,p);
        p.close();
    }

/*

*/
/*
1. Check overflow in pow function or in general
2. Check indices of read array function
3. Think of an easier solution because the problems you solve are always easy
4. Check iterator of loop
5. If still doesn't work, then jump from the 729th floor 'coz "beta tumse na ho paayega"

    Move to top!!
*/
    static class Foster
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        StringTokenizer st = new StringTokenizer("");
        String next()
        {
            while (!st.hasMoreTokens())
                try
                {
                    st = new StringTokenizer(br.readLine());
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            return st.nextToken();
        }
        int nextInt()
        {
            return Integer.parseInt(next());
        }
        long nextLong()
        {
            return Long.parseLong(next());
        }
        double nextDouble()
        {
            return Double.parseDouble(next());
        }
        int[] intArray(int n)                   // Check indices
        {
            int arr[] = new int[n];
            for(int i = 0; i < n; i++)
            {
                arr[i] = nextInt();
            }
            return arr;
        }
        long[] longArray(int n)                 // Check indices
        {
            long arr[] = new long[n];
            for(int i = 0; i < n; i++)
            {
                arr[i] = nextLong();
            }
            return arr;
        }
        int[] getBits(int n)                    //in Reverse Order
        {
            int a[] = new int[31];
            for(int i = 0; i < 31; i++)
            {
                if(((1<<i) & n) != 0)
                    a[i] = 1;
            }
            return a;
        }
        static long pow(long... a)
        {
            long mod = Long.MAX_VALUE;
            if(a.length == 3)   mod = a[2];
            long res = 1;
            while(a[1] > 0)
            {
                if((a[1] & 1) == 1)
                    res = (res * a[0]) % mod;
                a[1] /= 2;
                a[0] = (a[0] * a[0]) % mod;
            }
            return res;
        }
        void print(Object... o)
        {
            for(Object next : o)
            {
                System.out.print(next + " ");
            }
        }
        void println(Object... o)
        {
            for(Object next : o)
            {
                System.out.print(next + " ");
            }
            System.out.println();
        }
        void watch(Object...a) throws Exception
        {
            int i = 1;
            for (Object o: a)
            {
                boolean found = false;
                if (o.getClass().isArray())
                {
                    String type = o.getClass().getName().toString();
                    switch (type)
                    {
                        case "[I":
                        {
                            int[] test = (int[]) o;
                            println(i + " : " + Arrays.toString(test));
                            break;
                        }
                        case "[[I":
                        {
                            int[][] obj = (int[][]) o;

                            println(i + " : " + Arrays.deepToString(obj));
                            break;
                        }
                        case "[J":
                        {

                            long[] obj = (long[]) o;
                            println(i + " : " + Arrays.toString(obj));
                            break;
                        }
                        case "[[J":
                        {

                            long[][] obj = (long[][]) o;
                            println(i + " : " + Arrays.deepToString(obj));
                            break;
                        }
                        case "[D":
                        {

                            double[] obj = (double[]) o;
                            println(i + " : " + Arrays.toString(obj));
                            break;
                        }
                        case "[[D":
                        {

                            double[][] obj = (double[][]) o;
                            println(i + " : " + Arrays.deepToString(obj));
                            break;
                        }
                        case "[Ljava.lang.String":
                        {

                            String[] obj = (String[]) o;
                            println(i + " : " + Arrays.toString(obj));
                            break;
                        }
                        case "[[Ljava.lang.String":
                        {

                            String[][] obj = (String[][]) o;
                            println(i + " : " + Arrays.deepToString(obj));
                            break;
                        }
                        case "[C":
                        {
                            char[] obj = (char[]) o;
                            println(i + " : " + Arrays.toString(obj));
                            break;
                        }
                        case "[[C":
                        {

                            char[][] obj = (char[][]) o;
                            println(i + " : " + Arrays.deepToString(obj));
                            break;
                        }
                        default:
                        {
                            println(i + " : type not identified");
                            break;
                        }
                    }
                    found = true;
                }
                if (o.getClass() == ArrayList.class)
                {
                    println(i + " : LIST = " + o);
                    found = true;
                }
                if (o.getClass() == TreeSet.class)
                {
                    println(i + " : SET = " + o);
                    found = true;
                }
                if (o.getClass() == TreeMap.class)
                {
                    println(i + " : MAP = " + o);
                    found = true;
                }
                if (o.getClass() == HashMap.class)
                {
                    println(i + " : MAP = " + o);
                    found = true;
                }
                if (o.getClass() == LinkedList.class)
                {
                    println(i + " : LIST = " + o);
                    found = true;
                }
                if (o.getClass() == PriorityQueue.class)
                {
                    println(i + " : PQ = " + o);
                    found = true;
                }
                if (!found)
                {
                    println(i + " = " + o);
                }
                i++;
            }
        }
    }
}


import java.io.*;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;
import static java.lang.Math.PI;
import static java.lang.System.in;
import static java.lang.System.out;

public class B
{
    static int n,m;
    static boolean vis[][];
    static int dx[] = {0, 0};
    static int dy[] = {1,-1};

    static boolean isValid(int x, int y)
    {
        if(x > n || x < 1 || y > m || y < 1)
            return false;
        return true;
    }
    static boolean onBorder(int x, int y)
    {
        if(y == 1 || y == m)
            return true;
        return false;
    }

    static void dfs(int x, int y, PrintWriter p)
    {
        vis[x][y] = true;
        p.println(x +" " + y);
        for(int i = 0; i < 2; i++)
        {
            int X = x + dx[i];
            int Y = y + dy[i];
            if(isValid(X, Y) && !vis[X][Y])
                dfs(X, Y, p);
        }
        if(onBorder(x,y))
        {
            for(int i = 1; i <= n; i++)
            {
                if(!vis[i][y])
                    dfs(i,y,p);
            }
        }

    }

    public static void main(String [] args) throws Exception
    {
        Foster sc = new Foster();
        PrintWriter p = new PrintWriter(out);
        n = sc.nextInt();
        m = sc.nextInt();
        int x = sc.nextInt(), y = sc.nextInt();
        vis = new boolean[n+1][m+1];
        for(int i = y; i <= m; i++)
        {
            if(i != m)
            p.println(x +" " + i);
            vis[x][i] = true;
        }
        for(int i = 1; i < y; i++)
        {
            if(i != m)
            p.println(x +" " + i);
            vis[x][i] = true;
        }
        y = m;
        vis[x][y] = false;
        dfs(x,y,p);
        p.close();
    }

/*

*/
/*
1. Check overflow in pow function or in general
2. Check indices of read array function
3. Think of an easier solution because the problems you solve are always easy
4. Check iterator of loop
5. If still doesn't work, then jump from the 729th floor 'coz "beta tumse na ho paayega"

    Move to top!!
*/
    static class Foster
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        StringTokenizer st = new StringTokenizer("");
        String next()
        {
            while (!st.hasMoreTokens())
                try
                {
                    st = new StringTokenizer(br.readLine());
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            return st.nextToken();
        }
        int nextInt()
        {
            return Integer.parseInt(next());
        }
        long nextLong()
        {
            return Long.parseLong(next());
        }
        double nextDouble()
        {
            return Double.parseDouble(next());
        }
        int[] intArray(int n)                   // Check indices
        {
            int arr[] = new int[n];
            for(int i = 0; i < n; i++)
            {
                arr[i] = nextInt();
            }
            return arr;
        }
        long[] longArray(int n)                 // Check indices
        {
            long arr[] = new long[n];
            for(int i = 0; i < n; i++)
            {
                arr[i] = nextLong();
            }
            return arr;
        }
        int[] getBits(int n)                    //in Reverse Order
        {
            int a[] = new int[31];
            for(int i = 0; i < 31; i++)
            {
                if(((1<<i) & n) != 0)
                    a[i] = 1;
            }
            return a;
        }
        static long pow(long... a)
        {
            long mod = Long.MAX_VALUE;
            if(a.length == 3)   mod = a[2];
            long res = 1;
            while(a[1] > 0)
            {
                if((a[1] & 1) == 1)
                    res = (res * a[0]) % mod;
                a[1] /= 2;
                a[0] = (a[0] * a[0]) % mod;
            }
            return res;
        }
        void print(Object... o)
        {
            for(Object next : o)
            {
                System.out.print(next + " ");
            }
        }
        void println(Object... o)
        {
            for(Object next : o)
            {
                System.out.print(next + " ");
            }
            System.out.println();
        }
        void watch(Object...a) throws Exception
        {
            int i = 1;
            for (Object o: a)
            {
                boolean found = false;
                if (o.getClass().isArray())
                {
                    String type = o.getClass().getName().toString();
                    switch (type)
                    {
                        case "[I":
                        {
                            int[] test = (int[]) o;
                            println(i + " : " + Arrays.toString(test));
                            break;
                        }
                        case "[[I":
                        {
                            int[][] obj = (int[][]) o;

                            println(i + " : " + Arrays.deepToString(obj));
                            break;
                        }
                        case "[J":
                        {

                            long[] obj = (long[]) o;
                            println(i + " : " + Arrays.toString(obj));
                            break;
                        }
                        case "[[J":
                        {

                            long[][] obj = (long[][]) o;
                            println(i + " : " + Arrays.deepToString(obj));
                            break;
                        }
                        case "[D":
                        {

                            double[] obj = (double[]) o;
                            println(i + " : " + Arrays.toString(obj));
                            break;
                        }
                        case "[[D":
                        {

                            double[][] obj = (double[][]) o;
                            println(i + " : " + Arrays.deepToString(obj));
                            break;
                        }
                        case "[Ljava.lang.String":
                        {

                            String[] obj = (String[]) o;
                            println(i + " : " + Arrays.toString(obj));
                            break;
                        }
                        case "[[Ljava.lang.String":
                        {

                            String[][] obj = (String[][]) o;
                            println(i + " : " + Arrays.deepToString(obj));
                            break;
                        }
                        case "[C":
                        {
                            char[] obj = (char[]) o;
                            println(i + " : " + Arrays.toString(obj));
                            break;
                        }
                        case "[[C":
                        {

                            char[][] obj = (char[][]) o;
                            println(i + " : " + Arrays.deepToString(obj));
                            break;
                        }
                        default:
                        {
                            println(i + " : type not identified");
                            break;
                        }
                    }
                    found = true;
                }
                if (o.getClass() == ArrayList.class)
                {
                    println(i + " : LIST = " + o);
                    found = true;
                }
                if (o.getClass() == TreeSet.class)
                {
                    println(i + " : SET = " + o);
                    found = true;
                }
                if (o.getClass() == TreeMap.class)
                {
                    println(i + " : MAP = " + o);
                    found = true;
                }
                if (o.getClass() == HashMap.class)
                {
                    println(i + " : MAP = " + o);
                    found = true;
                }
                if (o.getClass() == LinkedList.class)
                {
                    println(i + " : LIST = " + o);
                    found = true;
                }
                if (o.getClass() == PriorityQueue.class)
                {
                    println(i + " : PQ = " + o);
                    found = true;
                }
                if (!found)
                {
                    println(i + " = " + o);
                }
                i++;
            }
        }
    }
}


import java.io.*;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;
import static java.lang.Math.PI;
import static java.lang.System.in;
import static java.lang.System.out;

public class B
{
    static int n,m;
    static boolean vis[][];
    static int dx[] = {1,-1,0, 0};
    static int dy[] = {0, 0,1,-1};

    static boolean isValid(int x, int y)
    {
        if(x > n || x < 1 || y > m || y < 1)
            return false;
        return true;
    }

    static void dfs(int x, int y, PrintWriter p)
    {
        vis[x][y] = true;
        p.println(x +" " + y);
        for(int i = 0; i < 4; i++)
        {
            int X = x + dx[i];
            int Y = y + dy[i];
            if(isValid(X, Y) && !vis[X][Y])
                dfs(X, Y, p);
        }

    }

    public static void main(String [] args) throws Exception
    {
        Foster sc = new Foster();
        PrintWriter p = new PrintWriter(out);
        n = sc.nextInt();
        m = sc.nextInt();
        int x = sc.nextInt(), y = sc.nextInt();
        vis = new boolean[n+1][m+1];
        dfs(x,y,p);
        p.close();
    }

/*

*/
/*
1. Check overflow in pow function or in general
2. Check indices of read array function
3. Think of an easier solution because the problems you solve are always easy
4. Check iterator of loop
5. If still doesn't work, then jump from the 729th floor 'coz "beta tumse na ho paayega"

    Move to top!!
*/
    static class Foster
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        StringTokenizer st = new StringTokenizer("");
        String next()
        {
            while (!st.hasMoreTokens())
                try
                {
                    st = new StringTokenizer(br.readLine());
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            return st.nextToken();
        }
        int nextInt()
        {
            return Integer.parseInt(next());
        }
        long nextLong()
        {
            return Long.parseLong(next());
        }
        double nextDouble()
        {
            return Double.parseDouble(next());
        }
        int[] intArray(int n)                   // Check indices
        {
            int arr[] = new int[n];
            for(int i = 0; i < n; i++)
            {
                arr[i] = nextInt();
            }
            return arr;
        }
        long[] longArray(int n)                 // Check indices
        {
            long arr[] = new long[n];
            for(int i = 0; i < n; i++)
            {
                arr[i] = nextLong();
            }
            return arr;
        }
        int[] getBits(int n)                    //in Reverse Order
        {
            int a[] = new int[31];
            for(int i = 0; i < 31; i++)
            {
                if(((1<<i) & n) != 0)
                    a[i] = 1;
            }
            return a;
        }
        static long pow(long... a)
        {
            long mod = Long.MAX_VALUE;
            if(a.length == 3)   mod = a[2];
            long res = 1;
            while(a[1] > 0)
            {
                if((a[1] & 1) == 1)
                    res = (res * a[0]) % mod;
                a[1] /= 2;
                a[0] = (a[0] * a[0]) % mod;
            }
            return res;
        }
        void print(Object... o)
        {
            for(Object next : o)
            {
                System.out.print(next + " ");
            }
        }
        void println(Object... o)
        {
            for(Object next : o)
            {
                System.out.print(next + " ");
            }
            System.out.println();
        }
        void watch(Object...a) throws Exception
        {
            int i = 1;
            for (Object o: a)
            {
                boolean found = false;
                if (o.getClass().isArray())
                {
                    String type = o.getClass().getName().toString();
                    switch (type)
                    {
                        case "[I":
                        {
                            int[] test = (int[]) o;
                            println(i + " : " + Arrays.toString(test));
                            break;
                        }
                        case "[[I":
                        {
                            int[][] obj = (int[][]) o;

                            println(i + " : " + Arrays.deepToString(obj));
                            break;
                        }
                        case "[J":
                        {

                            long[] obj = (long[]) o;
                            println(i + " : " + Arrays.toString(obj));
                            break;
                        }
                        case "[[J":
                        {

                            long[][] obj = (long[][]) o;
                            println(i + " : " + Arrays.deepToString(obj));
                            break;
                        }
                        case "[D":
                        {

                            double[] obj = (double[]) o;
                            println(i + " : " + Arrays.toString(obj));
                            break;
                        }
                        case "[[D":
                        {

                            double[][] obj = (double[][]) o;
                            println(i + " : " + Arrays.deepToString(obj));
                            break;
                        }
                        case "[Ljava.lang.String":
                        {

                            String[] obj = (String[]) o;
                            println(i + " : " + Arrays.toString(obj));
                            break;
                        }
                        case "[[Ljava.lang.String":
                        {

                            String[][] obj = (String[][]) o;
                            println(i + " : " + Arrays.deepToString(obj));
                            break;
                        }
                        case "[C":
                        {
                            char[] obj = (char[]) o;
                            println(i + " : " + Arrays.toString(obj));
                            break;
                        }
                        case "[[C":
                        {

                            char[][] obj = (char[][]) o;
                            println(i + " : " + Arrays.deepToString(obj));
                            break;
                        }
                        default:
                        {
                            println(i + " : type not identified");
                            break;
                        }
                    }
                    found = true;
                }
                if (o.getClass() == ArrayList.class)
                {
                    println(i + " : LIST = " + o);
                    found = true;
                }
                if (o.getClass() == TreeSet.class)
                {
                    println(i + " : SET = " + o);
                    found = true;
                }
                if (o.getClass() == TreeMap.class)
                {
                    println(i + " : MAP = " + o);
                    found = true;
                }
                if (o.getClass() == HashMap.class)
                {
                    println(i + " : MAP = " + o);
                    found = true;
                }
                if (o.getClass() == LinkedList.class)
                {
                    println(i + " : LIST = " + o);
                    found = true;
                }
                if (o.getClass() == PriorityQueue.class)
                {
                    println(i + " : PQ = " + o);
                    found = true;
                }
                if (!found)
                {
                    println(i + " = " + o);
                }
                i++;
            }
        }
    }
}


import java.io.IOException;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.regex.*;

    public class Solution{
//        public static long  gcd(long a,long b)
//        {
//            while (b > 0)
//        {
//            long temp = b;
//            b = a % b;
//            a = temp;
//        }
//            return a;
//        }

   public static void main (String[] args)  throws IOException{
         Scanner sc=new Scanner(System.in);
	    int n=0;
            int m=0;
            int Sx=0;
            int Sy=0;
            if(sc.hasNextInt())
            {
                n=sc.nextInt();
                m=sc.nextInt();
                Sx=sc.nextInt();
                Sy=sc.nextInt();
            }
            System.out.println(Sx+""+Sy);
            for(int i=n;i>=1;i--)
            {
                if(i!=Sx)
                {
                    System.out.println(i+""+Sy);
                }

            }
            int direction=1;
            int i=0;
            for(int j=1;j<=m;j++)
            {
                if(j==Sy)
                {
                    continue;
                }
                if(j%2==1)
                {
                    direction=1;
                    i=1;
                }
                else
                {
                    direction=-1;
                    i=n;
                }

                while(i<=n&&i>=1)
                {
                    System.out.println(i+""+j);
                    i=i+direction;
                }
            }

   }
    }


import java.io.IOException;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.regex.*;

    public class Solution{
//        public static long  gcd(long a,long b)
//        {
//            while (b > 0)
//        {
//            long temp = b;
//            b = a % b;
//            a = temp;
//        }
//            return a;
//        }

   public static void main (String[] args)  throws IOException{
         Scanner sc=new Scanner(System.in);
	    int n=0;
            int m=0;
            int Sx=0;
            int Sy=0;
            if(sc.hasNextInt())
            {
                n=sc.nextInt();
                m=sc.nextInt();
                Sx=sc.nextInt();
                Sy=sc.nextInt();
            }
            System.out.println(Sx+" "+Sy);
            for(int i=n;i>=1;i--)
            {
                if(i!=Sx)
                {
                    System.out.println(i+" "+Sy);
                }

            }
            int direction=1;
            int i=0;
            for(int j=1;j<=m;j++)
            {
                if(j==Sy)
                {
                    continue;
                }
                if(j%2==1)
                {
                    direction=1;
                    i=1;
                }
                else
                {
                    direction=-1;
                    i=n;
                }

                while(i<=n&&i>=1)
                {
                    System.out.println(i+" "+j);
                    i=i+direction;
                }
            }

   }
    }


/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

import java.io.IOException;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.regex.*;

    public class Solution{
//        public static long  gcd(long a,long b)
//        {
//            while (b > 0)
//        {
//            long temp = b;
//            b = a % b;
//            a = temp;
//        }
//            return a;
//        }

   public static void main (String[] args)  throws IOException{
         Scanner sc=new Scanner(System.in);
	    int n=0;
            int m=0;
            int Sx=0;
            int Sy=0;
            if(sc.hasNextInt())
            {
                n=sc.nextInt();
                m=sc.nextInt();
                Sx=sc.nextInt();
                Sy=sc.nextInt();
            }
            System.out.println(Sx+" "+Sy);
            for(int i=n;i>=1;i--)
            {
                if(i!=Sx)
                {
                    System.out.println(i+" "+Sy);
                }

            }
            int direction=1;
            int i=0;
            for(int j=1;j<=m;j++)
            {
                if(j==Sy)
                {
                    continue;
                }
                if(j<Sy)
                {
                   if(j%2==1)
                {
                    direction=1;
                    i=1;
                }
                else
                {
                    direction=-1;
                    i=n;
                }

                while(i<=n&&i>=1)
                {
                    System.out.println(i+" "+j);
                    i=i+direction;
                }
                }
                else
                {
                      if(j%2==0)
                {
                    direction=1;
                    i=1;
                }
                else
                {
                    direction=-1;
                    i=n;
                }

                while(i<=n&&i>=1)
                {
                    System.out.println(i+" "+j);
                    i=i+direction;
                }
                }

            }

   }
    }


import java.io.IOException;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.regex.*;

    public class Solution{
//        public static long  gcd(long a,long b)
//        {
//            while (b > 0)
//        {
//            long temp = b;
//            b = a % b;
//            a = temp;
//        }
//            return a;
//        }

   public static void main (String[] args)  throws IOException{
         Scanner sc=new Scanner(System.in);
	    int n=0;
            int m=0;
            int Sx=0;
            int Sy=0;
            if(sc.hasNextInt())
            {
                n=sc.nextInt();
                m=sc.nextInt();
                Sx=sc.nextInt();
                Sy=sc.nextInt();
            }
            System.out.println(Sx+" "+Sy);
            for(int i=n;i>=1;i--)
            {
                if(i!=Sx)
                {
                    System.out.println(i+" "+Sy);
                }

            }
            int direction=1;
            int i=0;
            for(int j=1;j<=m;j++)
            {
                if(j==Sy)
                {
                    continue;
                }
                if(j<Sy)
                {
                   if(j%2==1)
                {
                    direction=1;
                    i=1;
                }
                else
                {
                    direction=-1;
                    i=n;
                }

                while(i<=n&&i>=1)
                {
                    System.out.println(i+" "+j);
                    i=i+direction;
                }
                }
                else
                {
                      if(j%2==0)
                {
                    direction=1;
                    i=1;
                }
                else
                {
                    direction=-1;
                    i=n;
                }

                while(i<=n&&i>=1)
                {
                    System.out.println(i+" "+j);
                    i=i+direction;
                }
                }

            }


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;

public class b664 {
    static PrintWriter out;
    static BufferedReader in;
    static StringTokenizer st;

    public static void main(String[] args){
        out = new PrintWriter(System.out);
        in = new BufferedReader(new InputStreamReader(System.in));
        new b664().Run();
        out.close();
    }

    String ns() {
        try {
            if (st == null || !st.hasMoreTokens()) {
                st = new StringTokenizer(in.readLine());
            }
            return st.nextToken();
        } catch (Exception e) {
            return null;
        }
    }

    int nextint() {
        return Integer.valueOf(ns());
    }

    String nextline() {
        st = null;
        try {
            return in.readLine();
        } catch (Exception e) {
            return null;
        }
    }

    public void Run() {
        int n = nextint();
        int m = nextint();

        int curN = nextint() - 1;
        int curM = nextint() - 1;
        StringBuilder sb = new StringBuilder();
        int nextN = curN;
        int nextM = curM;

        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                int c = m - curM;
                sb.append(nextN + 1).append(" ").append(nextM + 1).append('\n');
                if(j - c == -1 && j != m - 1) nextM = 0;
                else if (j != m - 1){
                    nextM = nextM + 1;
                }
            }
            nextN = nextN + 1== n ? 0 : nextN + 1;
            curM = nextM;
        }
        out.print(sb);
    }
}


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;

public class b664 {
    static PrintWriter out;
    static BufferedReader in;
    static StringTokenizer st;

    public static void main(String[] args){
        out = new PrintWriter(System.out);
        in = new BufferedReader(new InputStreamReader(System.in));
        new b664().Run();
        out.close();
    }

    String ns() {
        try {
            if (st == null || !st.hasMoreTokens()) {
                st = new StringTokenizer(in.readLine());
            }
            return st.nextToken();
        } catch (Exception e) {
            return null;
        }
    }

    int nextint() {
        return Integer.valueOf(ns());
    }

    String nextline() {
        st = null;
        try {
            return in.readLine();
        } catch (Exception e) {
            return null;
        }
    }

    public void Run() {
        int n = nextint();
        int m = nextint();

        int curN = nextint() - 1;
        int curM = nextint() - 1;
        StringBuilder sb = new StringBuilder();
        int nextN = curN;
        int nextM = curM;

        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                int c = m - curM;
                sb.append(nextN + 1).append(" ").append(nextM + 1).append('\n');
                if(j - c != 0) nextM = nextM + 1 == m ? 0 : nextM + 1;
            }
            nextN = nextN + 1== n ? 0 : nextN + 1;
        }
        out.print(sb);
    }
}


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;

public class b664 {
    static PrintWriter out;
    static BufferedReader in;
    static StringTokenizer st;

    public static void main(String[] args){
        out = new PrintWriter(System.out);
        in = new BufferedReader(new InputStreamReader(System.in));
        new b664().Run();
        out.close();
    }

    String ns() {
        try {
            if (st == null || !st.hasMoreTokens()) {
                st = new StringTokenizer(in.readLine());
            }
            return st.nextToken();
        } catch (Exception e) {
            return null;
        }
    }

    int nextint() {
        return Integer.valueOf(ns());
    }

    String nextline() {
        st = null;
        try {
            return in.readLine();
        } catch (Exception e) {
            return null;
        }
    }

    public void Run() {
        int n = nextint();
        int m = nextint();

        int curN = nextint() - 1;
        int curM = nextint() - 1;
        StringBuilder sb = new StringBuilder();
        int nextN = curN;
        int nextM = curM;

        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                int c = m - curM;
                sb.append(nextM + 1).append(" ").append(nextN + 1).append('\n');
                if(j - c != 0) nextM = nextM + 1 == m ? 0 : nextM + 1;
            }
            nextN = nextN + 1== n ? 0 : nextN + 1;
        }
        out.print(sb);
    }
}


import java.util.*;

public class Solution {
    public static void mainA(String[] args) {
        final Scanner in = new Scanner(System.in);

        final int T = in.nextInt();

        for (int t = 0; t < T; t += 1) {
            final int r = in.nextInt();
            final int g = in.nextInt();
            final int b = in.nextInt();
            final int w = in.nextInt();

            boolean possible =
                (r & 1) + (g & 1) + (b & 1) + (w & 1) <= 1 ||
                ((r > 0 && g > 0 && b > 0) && ((~r) & 1) + ((~g) & 1) + ((~b) & 1) + ((~w) & 1) <= 1);

            System.out.println(possible ? "Yes" : "No");
        }
    }

    private static void append(StringBuilder sb, int x, int y) {
        sb.append(x);
        sb.append(' ');
        sb.append(y);
        sb.append('\n');
    }

    public static void mainB(String[] args) {
        final Scanner in = new Scanner(System.in);

        final int rows = in.nextInt();
        final int cols = in.nextInt();

        final int y = in.nextInt();
        final int x = in.nextInt();

        StringBuilder sb = new StringBuilder();

        append(sb, y, x);

        for (int c = 1; c <= cols; c += 1) {
            if (c == x) continue;
            append(sb, y, c);
        }

        boolean left = true;

        for (int r = 1; r <= rows; r += 1) {
            if (r == y) continue;
            if (left) {
                for (int c = cols; c >= 1; c -= 1) {
                    append(sb, r, c);
                }
            } else {
                for (int c = 1; c <= cols; c += 1) {
                    append(sb, r, c);
                }
            }
            left = !left;
        }

        System.out.println(sb);
    }

    public static void mainC(String[] args) {
        final Scanner in = new Scanner(System.in);

        final int T = in.nextInt();

        for (int t = 0; t < T; t += 1) {
            final int n = in.nextInt();

            final int[] w = new int[n];

            for (int i = 0; i < n; i += 1) w[i] = in.nextInt();

            int max = 0;

            System.out.println(max);
//            System.out.println("=======");
        }
    }

    public static void mainD(String[] args) {
        final Scanner in = new Scanner(System.in);

        final int T = in.nextInt();

        for (int t = 0; t < T; t += 1) {
            final int n = in.nextInt();
            in.nextLine();

            final char[] s = in.nextLine().toCharArray();

            StringBuilder sb = new StringBuilder();

            System.out.println(sb);
        }
    }

    public static void mainE1(String[] args) {
        final Scanner in = new Scanner(System.in);

        final int T = in.nextInt();

        for (int t = 0; t < T; t += 1) {
            final int n = in.nextInt();

            final long s = in.nextLong();

            final int[][] edges = new int[n - 1][];

            for (int i = n - 2; i >= 0; i -= 1) {
                edges[i] = new int[] { in.nextInt(), in.nextInt(), in.nextInt() };
            }

            for (int i = 0; i < n - 1; i += 1) {
                System.out.println(Arrays.toString(edges[i]));
            }
        }

    }

    public static void mainF(String[] args) {
        final Scanner in = new Scanner(System.in);

        final int T = in.nextInt();

        for (int t = 0; t < T; t += 1) {
            final int n = in.nextInt();

            System.out.println(n);
//            System.out.println("=======");
        }
    }

    public static void main(String[] args) {
        mainB(args);
    }
}


import java.util.*;

public class Solution {
    public static void mainA(String[] args) {
        final Scanner in = new Scanner(System.in);

        final int T = in.nextInt();

        for (int t = 0; t < T; t += 1) {
            final int r = in.nextInt();
            final int g = in.nextInt();
            final int b = in.nextInt();
            final int w = in.nextInt();

            boolean possible =
                (r & 1) + (g & 1) + (b & 1) + (w & 1) <= 1 ||
                ((r > 0 && g > 0 && b > 0) && ((~r) & 1) + ((~g) & 1) + ((~b) & 1) + ((~w) & 1) <= 1);

            System.out.println(possible ? "Yes" : "No");
        }
    }

    private static void append(StringBuilder sb, int x, int y) {
        sb.append(x);
        sb.append(' ');
        sb.append(y);
        sb.append('\n');
    }

    public static void mainB(String[] args) {
        final Scanner in = new Scanner(System.in);

        final int rows = in.nextInt();
        final int cols = in.nextInt();

        final int x = in.nextInt();
        final int y = in.nextInt();

        StringBuilder sb = new StringBuilder();

        append(sb, y, x);

        for (int c = 1; c <= cols; c += 1) {
            if (c == x) continue;
            append(sb, y, c);
        }

        boolean left = true;

        for (int r = 1; r <= rows; r += 1) {
            if (r == y) continue;
            if (left) {
                for (int c = cols; c >= 1; c -= 1) {
                    append(sb, r, c);
                }
            } else {
                for (int c = 1; c <= cols; c += 1) {
                    append(sb, r, c);
                }
            }
            left = !left;
        }

        System.out.println(sb);
    }

    public static void mainC(String[] args) {
        final Scanner in = new Scanner(System.in);

        final int T = in.nextInt();

        for (int t = 0; t < T; t += 1) {
            final int n = in.nextInt();

            final int[] w = new int[n];

            for (int i = 0; i < n; i += 1) w[i] = in.nextInt();

            int max = 0;

            System.out.println(max);
//            System.out.println("=======");
        }
    }

    public static void mainD(String[] args) {
        final Scanner in = new Scanner(System.in);

        final int T = in.nextInt();

        for (int t = 0; t < T; t += 1) {
            final int n = in.nextInt();
            in.nextLine();

            final char[] s = in.nextLine().toCharArray();

            StringBuilder sb = new StringBuilder();

            System.out.println(sb);
        }
    }

    public static void mainE1(String[] args) {
        final Scanner in = new Scanner(System.in);

        final int T = in.nextInt();

        for (int t = 0; t < T; t += 1) {
            final int n = in.nextInt();

            final long s = in.nextLong();

            final int[][] edges = new int[n - 1][];

            for (int i = n - 2; i >= 0; i -= 1) {
                edges[i] = new int[] { in.nextInt(), in.nextInt(), in.nextInt() };
            }

            for (int i = 0; i < n - 1; i += 1) {
                System.out.println(Arrays.toString(edges[i]));
            }
        }

    }

    public static void mainF(String[] args) {
        final Scanner in = new Scanner(System.in);

        final int T = in.nextInt();

        for (int t = 0; t < T; t += 1) {
            final int n = in.nextInt();

            System.out.println(n);
//            System.out.println("=======");
        }
    }

    public static void main(String[] args) {
        mainB(args);
    }
}