#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:1000000000")
using namespace std;
const bool db = false;
int n, m, x, y;
int a[1010][1010], b[1010][1010];
long long s[1010][1010], cs[1010][1010];
vector<pair<int, int> > ans;
char mark[1010][1010];
pair<long long, pair<int, int> > st[1010 * 1010];
int sz = 0;
long long sum(int lx, int ly, int rx, int ry) {
  return s[rx][ry] + s[lx - 1][ly - 1] - s[rx][ly - 1] - s[lx - 1][ry];
}
int main() {
  scanf("%d%d%d%d", &n, &m, &x, &y);
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
      scanf("%d", &a[i][j]);
      s[i][j] = a[i][j] + s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
    }
  }
  for (int i = 1; i <= n; ++i) {
    deque<int> dq;
    for (int j = 1; j < y; ++j) {
      while (!dq.empty() && dq.back() > a[i][j]) dq.pop_back();
      dq.push_back(a[i][j]);
    }
    for (int j = 1; j + y - 1 <= m; ++j) {
      if (j != 1) {
        if (a[i][j - 1] == dq.front()) dq.pop_front();
      }
      while (!dq.empty() && dq.back() > a[i][j + y - 1]) dq.pop_back();
      dq.push_back(a[i][j + y - 1]);
      b[i][j] = dq.front();
    }
  }
  for (int i = 1; i + y - 1 <= m; ++i) {
    deque<int> dq;
    for (int j = 1; j < x; ++j) {
      while (!dq.empty() && dq.back() > b[j][i]) dq.pop_back();
      dq.push_back(b[j][i]);
    }
    for (int j = 1; j + x - 1 <= n; ++j) {
      if (j != 1) {
        if (b[j - 1][i] == dq.front()) dq.pop_front();
      }
      while (!dq.empty() && dq.back() > b[j + x - 1][i]) dq.pop_back();
      dq.push_back(b[j + x - 1][i]);
      cs[j][i] = dq.front();
    }
  }
  long long tot = 1LL << 60;
  for (int i = 1; i + x - 1 <= n; ++i) {
    for (int j = 1; j + y - 1 <= m; ++j) {
      st[sz].first = cs[i][j] =
          sum(i, j, i + x - 1, j + y - 1) - 1LL * x * y * cs[i][j];
      st[sz].second.first = i;
      st[sz++].second.second = j;
    }
  }
  sort(st, st + sz);
  ans.reserve(n * m);
  for (int it = 0; it < sz; ++it) {
    int i = st[it].second.first, j = st[it].second.second;
    if (mark[i][j] || mark[i + x - 1][j] || mark[i][j + y - 1] ||
        mark[i + x - 1][j + y - 1]) {
      continue;
    }
    ans.emplace_back(make_pair(i, j));
    for (int di = 0; di < x; ++di) {
      for (int dj = 0; dj < y; ++dj) {
        mark[i + di][j + dj] = 1;
      }
    }
  }
  cout << ans.size() << '\n';
  for (int i = 0; i < ans.size(); ++i)
    printf("%d %d %lld\n", ans[i].first, ans[i].second,
           cs[ans[i].first][ans[i].second]);
  getchar();
  getchar();
  return 0;
}
