#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
int dir[4][2] = {{0, 1}, {0, -1}, {-1, 0}, {1, 0}};
long long gcd(long long n, long long m) { return m == 0 ? n : gcd(m, n % m); }
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
int day[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int run(int y) {
  if (y % 400 == 0) {
    return 1;
  }
  if (y % 100 != 0 && y % 4 == 0) {
    return 1;
  }
  return 0;
}
long long q_p(long long x, long long n, long long mod) {
  long long ans = 1;
  while (n) {
    if (n & 1) {
      ans = x * ans % mod;
    }
    n = n >> 1;
    x = x * x % mod;
  }
  return ans;
}
long long qpow(long long x, long long n) {
  long long ans = 1;
  while (n) {
    if (n & 1) {
      ans = x * ans;
    }
    n = n >> 1;
    x = x * x;
  }
  return ans;
}
long long jc(long long n, long long cnt) {
  long long sum = 1;
  while (cnt != 0) {
    cnt--;
    sum *= n;
    n -= 1;
  }
  return sum;
}
int dp1() {
  int n, k;
  int d[100][100];
  cin >> n >> k;
  int v[n + 10], w[n + 10];
  for (int i = 1; i <= n; i++) {
    cin >> w[i];
    cin >> v[i];
  }
  for (int i = 0; i <= n; i++) {
    for (int j = 0; j < n; j++) {
      d[i][j] = 0;
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= k; j++) {
      if (j < w[i]) {
        d[i][j] = d[i - 1][j];
      } else {
        if (d[i - 1][j] > d[i - 1][j - w[i]] + v[i]) {
          d[i][j] = d[i - 1][j];
        } else {
          d[i][j] = d[i - 1][j - w[i]] + v[i];
        }
      }
    }
  }
  return d[n][k];
}
int prim[168] = {
    2,   3,   5,   7,   11,  13,  17,  19,  23,  29,  31,  37,  41,  43,
    47,  53,  59,  61,  67,  71,  73,  79,  83,  89,  97,  101, 103, 107,
    109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181,
    191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263,
    269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349,
    353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433,
    439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521,
    523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613,
    617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701,
    709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809,
    811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887,
    907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997};
struct M {
  long long data[2][2];
  M() { memset(data, 0, sizeof(data)); }
};
M mul(M a, M b) {
  M ans;
  ans.data[0][0] = (a.data[0][0] * b.data[0][0] + a.data[0][1] * b.data[1][0]);
  ans.data[0][1] = (a.data[0][0] * b.data[0][1] + a.data[0][1] * b.data[1][1]);
  ans.data[1][0] = (a.data[1][0] * b.data[0][0] + a.data[1][1] * b.data[1][0]);
  ans.data[1][1] = (a.data[1][0] * b.data[0][1] + a.data[1][1] * b.data[1][1]);
  return ans;
}
M qqpow(M m, long long n) {
  M E;
  E.data[0][0] = 1;
  E.data[1][1] = 1;
  while (n != 0) {
    if (n & 1) {
      E = mul(E, m);
    }
    m = mul(m, m);
    n = n >> 1;
  }
  return E;
}
const int mm = 1e5 + 10;
vector<long long> p[mm];
int vis[mm];
long long w[mm], g[mm];
long long ww[mm];
long long ans = 0;
int n, k;
void dfs_s(int root, int cnt, int f) {
  if (vis[root]) {
    cnt++;
  }
  if (cnt > 2) {
    return;
  }
  if (cnt <= 2 && p[root].size() == 1) {
    ans++;
    return;
  }
  for (int i = 0; i < p[root].size(); i++) {
    int son = p[root][i];
    if (son != f) {
      dfs_s(son, cnt, root);
    }
  }
}
int h[100000], W[100000];
int book[510][510];
int H;
int hh;
inline int read() {
  int f = 1, num = 0;
  char ch = getchar();
  while (0 == isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (0 != isdigit(ch))
    num = (num << 1) + (num << 3) + ch - '0', ch = getchar();
  return num * f;
}
void ksort(int a[], int l, int r) {
  int i = l, j = r;
  int temp = a[i];
  while (i < j) {
    while (i < j && a[j] >= temp) {
      j--;
    }
    if (i < j) {
      a[i] = a[j];
      i++;
    }
    while (i < j && a[i] < temp) {
      i++;
    }
    if (i < j) {
      a[j] = a[i];
      j--;
    }
  }
  a[i] = temp;
  if (i > l) ksort(a, l, i - 1);
  if (i < r) ksort(a, i + 1, r);
}
int m;
int dx, dy;
int cx, cy;
char mp[1010][1010];
struct node {
  int jc[N], v1, v2;
  long long mod;
  void init() {
    jc[0] = 1;
    for (int i = 1; i < N; i++) jc[i] = 1ll * jc[i - 1] * i % mod;
  }
  void add1(int x) { v1 = 1ll * v1 * jc[x] % mod; }
  void add2(int x) { v2 = 1ll * v2 * jc[x] % mod; }
} rd, nd, cd, c[4];
queue<struct node> qq;
int bfs() {}
int main(int argc, char** argv) {
  int n, m, sx, sy;
  cin >> n >> m >> sx >> sy;
  cout << sx << " " << sy << endl;
  cout << 1 << " " << sy << endl;
  for (int i = 1; i <= n; i++) {
    if (i % 2 == 0) {
      for (int j = m; j >= 1; j--) {
        if (i == 1 && j == sy) {
          continue;
        }
        if (i == sx && j == sy) {
          continue;
        }
        cout << i << " " << j << endl;
      }
    } else {
      for (int j = 1; j <= m; j++) {
        if (i == 1 && j == sy) {
          continue;
        }
        if (i == sx && j == sy) {
          continue;
        }
        cout << i << " " << j << endl;
      }
    }
  }
  return 0;
}
