#include <bits/stdc++.h>
const int N = 1000 + 10;
struct tnode {
  int x, y;
  long long val;
  tnode() {}
  tnode(int _x, int _y, long long _val) {
    x = _x;
    y = _y;
    val = _val;
  }
};
int n, m, r, c;
int a[N][N], b[N][N], f[N][N];
long long sum[N][N];
int Q[N], head, tail;
std::vector<tnode> ans, out;
bool vis[N][N];
long long S(int x1, int y1, int x2, int y2) {
  return sum[x2][y2] - sum[x2][y1 - 1] - sum[x1 - 1][y2] + sum[x1 - 1][y1 - 1];
}
bool cmp(const tnode& i, const tnode& j) {
  if (i.val != j.val)
    return i.val < j.val;
  else if (i.x != j.x)
    return i.x < j.x;
  else
    return i.y < j.y;
}
int main() {
  scanf("%d%d%d%d", &n, &m, &r, &c);
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j) {
      scanf("%d", &a[i][j]);
      sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + a[i][j];
    }
  for (int i = 1; i <= n; ++i) {
    head = tail = 0;
    for (int j = 1; j <= m; ++j) {
      while (head != tail && a[i][Q[tail - 1]] >= a[i][j]) {
        if (--tail < 0) tail = N - 1;
      }
      while (head != tail && Q[head] < j - c + 1) {
        if (++head == N) head = 0;
      }
      Q[tail++] = j;
      if (tail == N) tail = 0;
      if (j >= c) b[i][j - c + 1] = a[i][Q[head]];
    }
  }
  for (int j = 1; j + c - 1 <= m; ++j) {
    head = tail = 0;
    for (int i = 1; i <= n; ++i) {
      while (head != tail && b[Q[tail - 1]][j] >= b[i][j]) {
        if (--tail < 0) tail = N - 1;
      }
      while (head != tail && Q[head] < i - r + 1) {
        if (++head == N) head = 0;
      }
      Q[tail++] = i;
      if (tail == N) tail = 0;
      if (i >= r) f[i - r + 1][j] = b[Q[head]][j];
    }
  }
  for (int i = 1; i + r - 1 <= n; ++i)
    for (int j = 1; j + c - 1 <= m; ++j) {
      ans.push_back(tnode(
          i, j, S(i, j, i + r - 1, j + c - 1) - (long long)f[i][j] * r * c));
    }
  std::sort(ans.begin(), ans.end(), cmp);
  for (int i = 0; i < ans.size(); ++i) {
    if (vis[ans[i].x][ans[i].y]) continue;
    out.push_back(ans[i]);
    for (int j = std::max(1, ans[i].x - r + 1); j <= ans[i].x + r - 1; ++j)
      for (int k = std::max(1, ans[i].y - c + 1); k <= ans[i].y + c - 1; ++k)
        vis[j][k] = true;
  }
  printf("%d\n", out.size());
  for (int i = 0; i < out.size(); ++i) {
    printf("%d %d %I64d\n", out[i].x, out[i].y, out[i].val);
  }
  return 0;
}
