#include <bits/stdc++.h>
using namespace std;
int Ans[1009][1008], h[1009][1009], temp[1009][1009], pac[1009][1009];
long long cum[1009][1009];
struct node {
  long long val;
  int x, y;
};
vector<node> v, omar;
bool cmp(node a, node b) {
  if (a.val == b.val) {
    if (a.x == b.x) return a.y < b.y;
    return a.x < b.x;
  }
  return a.val < b.val;
}
int n, m, a, b, I, J;
multiset<int> S;
int main() {
  memset(Ans, -1, sizeof Ans);
  cin >> n >> m >> a >> b;
  if (a == 1 && b == 1) {
    cout << n * m << endl;
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= m; j++) printf("%d %d 0\n", i, j);
    return 0;
  }
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) scanf("%d", &h[i][j]);
  for (int j = 1; j <= m; j++) {
    S.clear();
    for (int i = 1; i < a; i++) S.insert(h[i][j]);
    for (int i = a; i <= n; i++) {
      S.insert(h[i][j]);
      if (S.size() > a) S.erase(S.find(h[i - a][j]));
      temp[i - a + 1][j] = *S.begin();
    }
  }
  for (int i = 1; i <= n - a + 1; i++) {
    S.clear();
    for (int j = 1; j < b; j++) {
      S.insert(temp[i][j]);
    }
    for (int j = b; j <= m; j++) {
      S.insert(temp[i][j]);
      if (S.size() > b) S.erase(S.find(temp[i][j - b]));
      Ans[i][j - b + 1] = *S.begin();
    }
  }
  int sz = m * n;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) cum[i][j] = cum[i][j - 1] + 1ll * h[i][j];
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) cum[i][j] = cum[i][j] + cum[i - 1][j];
  v.clear();
  for (int i = 1; i <= n - a + 1; i++)
    for (int j = 1; j <= m - b + 1; j++) {
      long long zbr = cum[i + a - 1][j + b - 1] - cum[i - 1][j + b - 1] -
                      cum[i + a - 1][j - 1] + cum[i - 1][j - 1];
      long long nigg = zbr - 1ll * a * b * 1ll * Ans[i][j];
      v.push_back({nigg, i, j});
    }
  memset(pac, 0, sizeof pac);
  sort(v.begin(), v.end(), cmp);
  sz = v.size();
  for (int i = 0; i < sz; i++) {
    int x = v[i].x, y = v[i].y;
    long long val = v[i].val;
    if (pac[x][y]) continue;
    omar.push_back({val, x, y});
    for (int j = max(x - a + 1, 1); j < x + a && j <= n; j++) {
      for (int k = max(1, y - b + 1); k < y + b && k <= m; k++) {
        pac[j][k] = 1;
      }
    }
  }
  sz = omar.size();
  cout << sz << endl;
  for (int i = 0; i < sz; i++) {
    printf("%d %d %lld\n", omar[i].x, omar[i].y, omar[i].val);
  }
  v.clear();
}
