#include <bits/stdc++.h>
using namespace std;
long long mp[1005][1005], sum[1005][1005], hh[1005][1005], Min[1005][1005];
int st[1005], top = 0, r[1005 * 1005], vis[1005][1005] = {0};
int n, m, a, b;
struct node {
  int x, y;
  long long sum;
} ans[1005 * 1005];
int lowbit(int x) { return x & (-x); }
void update(int x, int y, int val) {
  while (x) {
    int y0 = y;
    while (y0) {
      vis[x][y0] += val;
      y0 -= lowbit(y0);
    }
    x -= lowbit(x);
  }
}
int get(int x, int y) {
  int ret = 0;
  while (x <= n) {
    int y0 = y;
    while (y0 <= m) {
      ret += vis[x][y0];
      y0 += lowbit(y0);
    }
    x += lowbit(x);
  }
  return ret;
}
bool cmpr(int i, int j) {
  int x1 = (i - 1) / m + 1, y1 = (i - 1) % m + 1;
  int x2 = (j - 1) / m + 1, y2 = (j - 1) % m + 1;
  return (sum[x1][y1] - Min[x1][y1] * a * b) <
         (sum[x2][y2] - Min[x2][y2] * a * b);
}
int main() {
  scanf("%d%d%d%d", &n, &m, &a, &b);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) scanf("%I64d", &mp[i][j]);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) hh[i][j] = hh[i][j - 1] + mp[i][j];
  for (int i = 1; i <= n; i++)
    for (int j = 1; j + b - 1 <= m; j++)
      sum[i][j] = hh[i][j + b - 1] - hh[i][j - 1];
  for (int j = 1; j + b - 1 <= m; j++)
    for (int i = 1; i <= n; i++) hh[i][j] = hh[i - 1][j] + sum[i][j];
  for (int j = 1; j + b - 1 <= m; j++)
    for (int i = 1; i + a - 1 <= n; i++)
      sum[i][j] = hh[i + a - 1][j] - hh[i - 1][j];
  for (int i = 1; i <= n; i++) {
    int head = 0, tail = 0;
    for (int j = 1; j <= m; j++) {
      while (tail > head && mp[i][st[tail - 1]] > mp[i][j]) tail--;
      st[tail++] = j;
      if (j > b && st[head] == j - b) head++;
      if (j >= b) hh[i][j - b + 1] = mp[i][st[head]];
    }
  }
  for (int j = 1; j + b - 1 <= m; j++) {
    int head = 0, tail = 0;
    for (int i = 1; i <= n; i++) {
      while (tail > head && hh[st[tail - 1]][j] > hh[i][j]) tail--;
      st[tail++] = i;
      if (i > a && st[head] == i - a) head++;
      if (i >= a) Min[i - a + 1][j] = hh[st[head]][j];
    }
  }
  n = n - a + 1;
  m = m - b + 1;
  for (int i = 1; i <= n * m; i++) r[i] = i;
  stable_sort(r + 1, r + n * m + 1, cmpr);
  for (int i = 1; i <= n * m; i++) {
    int x = (r[i] - 1) / m + 1, y = (r[i] - 1) % m + 1;
    int tp = get(x, y);
    if (tp != 0) continue;
    node tmp = {x, y, sum[x][y] - Min[x][y] * a * b};
    ans[top++] = tmp;
    int s1 = max(1, x - a + 1), e1 = min(n, x + a - 1);
    int s2 = max(1, y - b + 1), e2 = min(m, y + b - 1);
    update(e1, e2, 1);
    update(s1 - 1, e2, -1);
    update(e1, s2 - 1, -1);
    update(s1 - 1, s2 - 1, 1);
  }
  printf("%d\n", top);
  for (int i = 0; i < top; i++)
    printf("%d %d %I64d\n", ans[i].x, ans[i].y, ans[i].sum);
  return 0;
}
