#include <bits/stdc++.h>
using namespace std;
const int MAXM = 1001;
int A, B, N, M;
int g[MAXM][MAXM];
long long sum[MAXM][MAXM];
int tot, len;
struct In {
  int xl, yl;
  long long cost;
} s[MAXM * MAXM], res[MAXM * MAXM];
int row[MAXM][MAXM], mins[MAXM][MAXM];
int first, last;
struct Q {
  int id;
  int v;
} pq[MAXM];
void find_mins() {
  int i, j, k;
  for (i = 1; i <= N; i++) {
    first = last = 0;
    pq[last].id = 1;
    pq[last++].v = g[i][1];
    for (j = 1; j <= B; j++) {
      last--;
      while (last >= first && pq[last].v >= g[i][j]) last--;
      last++;
      pq[last].id = j;
      pq[last++].v = g[i][j];
    }
    row[i][1] = pq[0].v;
    for (; j <= M; j++) {
      while (first < last && pq[first].id < j - B + 1) first++;
      last--;
      while (last >= first && pq[last].v >= g[i][j]) last--;
      last++;
      pq[last].id = j;
      pq[last++].v = g[i][j];
      row[i][j - B + 1] = pq[first].v;
    }
  }
  for (j = 1; j <= M - B + 1; j++) {
    first = last = 0;
    pq[last].id = 1;
    pq[last++].v = row[1][j];
    for (i = 1; i <= A; i++) {
      last--;
      while (last >= first && pq[last].v >= row[i][j]) last--;
      last++;
      pq[last].id = i;
      pq[last++].v = row[i][j];
    }
    mins[1][j] = pq[0].v;
    for (; i <= N; i++) {
      while (first < last && pq[first].id < i - A + 1) first++;
      last--;
      while (last >= first && pq[last].v >= row[i][j]) last--;
      last++;
      pq[last].id = i;
      pq[last++].v = row[i][j];
      mins[i - A + 1][j] = pq[first].v;
    }
  }
}
bool cmp(In a, In b) {
  if (a.cost != b.cost)
    return a.cost < b.cost;
  else if (a.xl != b.xl)
    return a.xl < b.xl;
  else
    return a.yl < b.yl;
}
int bit[MAXM][MAXM];
int find_sum(int x, int y) {
  int i, j, k = 0;
  while (x) {
    j = y;
    while (j) {
      k += bit[x][j];
      j -= (j & (-j));
    }
    x -= (x & (-x));
  }
  return k;
}
void update(int x, int y) {
  int i, j;
  while (x <= N) {
    j = y;
    while (j <= M) {
      bit[x][j]++;
      j += (j & (-j));
    }
    x += (x & (-x));
  }
}
int main() {
  scanf("%d%d%d%d", &N, &M, &A, &B);
  int i, j, k;
  for (i = 1; i <= N; i++)
    for (j = 1; j <= M; j++) {
      scanf("%d", &g[i][j]);
      sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + g[i][j];
    }
  find_mins();
  tot = 0;
  for (i = 1; i <= N - A + 1; i++) {
    for (j = 1; j <= M - B + 1; j++) {
      s[tot].xl = i;
      s[tot].yl = j;
      long long w = A * B;
      w *= mins[i][j];
      s[tot++].cost = sum[i + A - 1][j + B - 1] - sum[i + A - 1][j - 1] -
                      sum[i - 1][j + B - 1] + sum[i - 1][j - 1] - w;
    }
  }
  sort(s, s + tot, cmp);
  len = 0;
  int p, q;
  for (i = 0; i < tot; i++) {
    j = find_sum(s[i].xl + A - 1, s[i].yl + B - 1) -
        find_sum(s[i].xl + A - 1, s[i].yl - 1) -
        find_sum(s[i].xl - 1, s[i].yl + B - 1) +
        find_sum(s[i].xl - 1, s[i].yl - 1);
    if (j == 0) {
      res[len++] = s[i];
      for (p = s[i].xl; p <= s[i].xl + A - 1; p++)
        for (q = s[i].yl; q <= s[i].yl + B - 1; q++) update(p, q);
    }
  }
  printf("%d\n", len);
  for (i = 0; i < len; i++)
    printf("%d %d %I64d\n", res[i].xl, res[i].yl, res[i].cost);
  return 0;
}
