#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:256000000")
using namespace std;
int ar[1000][1000];
int mins[1000][1000];
long long sums[1000][1000];
bool occ[1000][1000];
int tmpm[1000][1000];
long long tmps[1000][1000];
int n, m;
int a, b;
int main() {
  cin >> n >> m >> a >> b;
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      scanf("%d", ar[i] + j);
    }
  }
  for (int i = 0; i < n; ++i) {
    stack<int> l, r;
    long long s = 0;
    for (int k = 0; k < b; ++k) s += ar[i][k];
    for (int j = 0; j < m - b + 1; ++j) {
      if (l.empty()) {
        while (!r.empty()) r.pop();
        int t = 1000000000;
        for (int k = b - 1; k >= 0; --k) l.push(t = min(t, ar[i][j + k]));
      }
      if (r.empty())
        tmpm[i][j] = l.top();
      else
        tmpm[i][j] = min(l.top(), r.top());
      tmps[i][j] = s;
      if (j + b < m) {
        s = s - ar[i][j] + ar[i][j + b];
        l.pop();
        if (r.empty())
          r.push(ar[i][j + b]);
        else
          r.push(min(r.top(), ar[i][j + b]));
      }
    }
  }
  for (int i = 0; i < m - b + 1; ++i) {
    stack<int> l, r;
    long long s = 0;
    for (int k = 0; k < a; ++k) s += tmps[k][i];
    for (int j = 0; j < n - a + 1; ++j) {
      if (l.empty()) {
        while (!r.empty()) r.pop();
        int t = 1000000000;
        for (int k = a - 1; k >= 0; --k) l.push(t = min(t, tmpm[j + k][i]));
      }
      if (r.empty())
        mins[j][i] = l.top();
      else
        mins[j][i] = min(l.top(), r.top());
      sums[j][i] = s;
      if (j + a < n) {
        s = s - tmps[j][i] + tmps[j + a][i];
        l.pop();
        if (r.empty())
          r.push(tmpm[j + a][i]);
        else
          r.push(min(r.top(), tmpm[j + a][i]));
      }
    }
  }
  priority_queue<pair<long long, pair<int, int> > > qu;
  for (int i = 0; i < n - a + 1; ++i) {
    for (int j = 0; j < m - b + 1; ++j) {
      qu.push(make_pair(-(sums[i][j] - 1LL * a * b * mins[i][j]),
                        make_pair(-i, -j)));
    }
  }
  vector<pair<pair<int, int>, long long> > res;
  while (!qu.empty()) {
    long long v = -qu.top().first;
    int y = -qu.top().second.first;
    int x = -qu.top().second.second;
    qu.pop();
    if (occ[y][x]) continue;
    res.push_back(make_pair(make_pair(y, x), v));
    for (int i = max(0, y - a + 1); i < min(n, y + a); ++i)
      for (int j = max(0, x - b + 1); j < min(m, x + b); ++j) occ[i][j] = true;
  }
  cout << res.size();
  for (int i = 0; i < res.size(); ++i)
    printf("\n%d %d %lld", res[i].first.first + 1, res[i].first.second + 1,
           res[i].second);
  return 0;
}
