#include <bits/stdc++.h>
using namespace std;
const int MX = 1010;
int n, m, a, b, mp[MX][MX], m1[MX][MX], mi[MX][MX];
long long sum[MX][MX];
vector<pair<pair<int, int>, long long> > out;
vector<pair<long long, pair<int, int> > > v;
bool mark[MX][MX];
deque<pair<int, long long> > d;
void add(int val) {
  long long cnt = 0;
  while (d.size() && d.back().first >= val) {
    cnt += d.back().second + 1;
    d.pop_back();
  }
  d.push_back(make_pair(val, cnt));
}
void pop() {
  if (d.front().second > 0)
    d.front().second--;
  else
    d.pop_front();
}
void mono_satr(int x) {
  d.clear();
  for (int i = 1; i < b; i++) add(mp[x][i]);
  for (int i = b; i <= m; i++) {
    add(mp[x][i]);
    m1[x][i - b + 1] = d.front().first;
    pop();
  }
}
void mono_sotun(int y) {
  d.clear();
  for (int i = 1; i < a; i++) add(m1[i][y]);
  for (int i = a; i <= n; i++) {
    add(m1[i][y]);
    mi[i - a + 1][y] = d.front().first;
    pop();
  }
}
long long f(int x, int y) {
  return (1LL * (1LL * sum[x + a - 1][y + b - 1] - 1LL * sum[x + a - 1][y - 1] -
                 1LL * sum[x - 1][y + b - 1] + 1LL * sum[x - 1][y - 1] -
                 1LL * mi[x][y] * 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("%d", &mp[i][j]);
  for (int i = 1; i <= n; i++) mono_satr(i);
  for (int j = 1; j + b - 1 <= m; j++) mono_sotun(j);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      sum[i][j] = 1LL * (1LL * sum[i - 1][j] + 1LL * sum[i][j - 1] -
                         1LL * sum[i - 1][j - 1] + 1LL * mp[i][j]);
  for (int i = 1; i + a - 1 <= n; i++)
    for (int j = 1; j + b - 1 <= m; j++)
      v.push_back(make_pair(f(i, j), make_pair(i, j)));
  sort(v.begin(), v.end());
  for (int i = 0; i < v.size(); i++) {
    long long val = v[i].first;
    int x = v[i].second.first, y = v[i].second.second;
    if (mark[x][y]) continue;
    out.push_back(make_pair(make_pair(x, y), val));
    for (int i = max(1, x - a + 1); i <= min(n, x + a - 1); i++)
      for (int j = max(1, y - b + 1); j <= min(m, y + b - 1); j++)
        mark[i][j] = 1;
  }
  printf("%d\n", out.size());
  for (int i = 0; i < out.size(); i++)
    printf("%d %d %lld \n", out[i].first.first, out[i].first.second,
           out[i].second);
  return -0;
}
