#include <bits/stdc++.h>
using namespace std;
int n, m, a, b;
int bit[1005][1005], mn[1005][1005], h[1005][1005];
long long sum[1005][1005];
struct Node {
  int x, y;
  long long v;
  Node() {}
  Node(int x, int y, long long v) : x(x), y(y), v(v) {}
  bool operator<(const Node& node) const {
    if (v != node.v) return v > node.v;
    if (x != node.x) return x > node.x;
    return y > node.y;
  }
};
long long get_sum(int i, int j) {
  int ii = i + a - 1, jj = j + b - 1;
  return sum[ii][jj] - sum[i - 1][jj] - sum[ii][j - 1] + sum[i - 1][j - 1];
}
priority_queue<Node> que;
vector<Node> v;
void update(int k1, int k2) {
  while (k1 <= n) {
    int k = k2;
    while (k <= m) {
      bit[k1][k]++;
      k += k & -k;
    }
    k1 += k1 & -k1;
  }
}
int read(int k1, int k2) {
  int ans = 0;
  while (k1) {
    int k = k2;
    while (k) {
      ans += bit[k1][k];
      k -= k & -k;
    }
    k1 -= k1 & -k1;
  }
  return ans;
}
bool ck(int x, int y) {
  return read(x + a - 1, y + b - 1) + read(x - 1, y - 1) -
             read(x + a - 1, y - 1) - read(x - 1, y + b - 1) ==
         0;
}
int q[1005], top, buttom;
int main() {
  scanf("%d%d", &n, &m);
  scanf("%d%d", &a, &b);
  for (int i = 1; i <= n; i++) {
    top = 0, buttom = 0;
    for (int j = 1; j <= m; j++) {
      scanf("%d", &h[i][j]);
      while (top > buttom && h[i][q[top - 1]] >= h[i][j]) top--;
      q[top++] = j;
      if (q[buttom] <= j - b) buttom++;
      mn[i][j] = h[i][q[buttom]];
      sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + h[i][j];
    }
  }
  for (int j = 1; j + b <= m + 1; j++) {
    top = 0, buttom = 0;
    for (int i = 1; i <= a - 1; i++) {
      while (top > buttom && mn[q[top - 1]][j + b - 1] >= mn[i][j + b - 1])
        top--;
      q[top++] = i;
    }
    for (int i = 1; i + a <= n + 1; i++) {
      while (top > buttom &&
             mn[q[top - 1]][j + b - 1] >= mn[i + a - 1][j + b - 1])
        top--;
      q[top++] = i + a - 1;
      if (q[buttom] < i) buttom++;
      int ans = mn[q[buttom]][j + b - 1];
      que.push(Node(i, j, get_sum(i, j) - 1ll * a * b * ans));
    }
  }
  while (!que.empty()) {
    Node tmp = que.top();
    que.pop();
    if (ck(tmp.x, tmp.y)) {
      v.push_back(tmp);
      for (int i = tmp.x; i < tmp.x + a; i++)
        for (int j = tmp.y; j < tmp.y + b; j++) update(i, j);
    }
  }
  printf("%u\n", v.size());
  for (vector<Node>::iterator it = v.begin(); it != v.end(); it++) {
    printf("%d %d %I64d\n", it->x, it->y, it->v);
  }
  return 0;
}
