#include <bits/stdc++.h>
using namespace std;
const int Maxn = 2e5 + 10;
int n, m, vis[Maxn];
long long l, r;
struct node {
  int x1, y1, x2, y2;
} ans[Maxn];
namespace Seg {
pair<int, int> w[Maxn << 2];
struct Init {
  Init() {
    for (int i = 1; i < (Maxn << 2); i++) w[i] = make_pair(Maxn, 0);
  }
} Initer;
void up(int u) { w[u] = min(w[u << 1], w[(u << 1) | 1]); }
void update(int u, int l, int r, int pos, pair<int, int> key) {
  if (l == r) {
    w[u] = key;
    return;
  }
  int mid = (l + r) >> 1;
  if (pos <= mid)
    update(u << 1, l, mid, pos, key);
  else
    update((u << 1) | 1, mid + 1, r, pos, key);
  up(u);
}
pair<int, int> query(int u, int l, int r, int li, int ri) {
  if (l > r || li > r || l > ri || li > ri) return make_pair(Maxn, 0);
  if (l == li && r == ri) return w[u];
  int mid = (l + r) >> 1;
  return min(query(u << 1, l, mid, li, min(mid, ri)),
             query((u << 1) | 1, mid + 1, r, max(mid + 1, li), ri));
}
}  // namespace Seg
int main() {
  scanf("%d%d%lld%lld", &n, &m, &l, &r);
  for (int t = min(n, m) - 1; t; t--) {
    for (int k = 1; k * (t + 1) <= m; k++)
      Seg::update(1, 1, m, (t + 1) * k, make_pair(t + 1, k));
    for (int g = 1; t * g <= n; g++)
      if (!vis[t * g] && l / (t * g) <= m) {
        pair<int, int> u = Seg::query(1, 1, m, l / (t * g) + (l % (t * g) > 0),
                                      min((long long)m, r / (t * g)));
        int p = u.first, k = u.second;
        if (p <= n / g)
          ans[t * g] = (node){t * g, k * p, g * p, t * k}, vis[t * g] = 1;
      }
  }
  for (int i = 1; i <= n; i++)
    if (vis[i])
      printf("%d %d %d %d\n", ans[i].x1, ans[i].y1, ans[i].x2, ans[i].y2);
    else
      puts("-1");
  return 0;
}
