#include <bits/stdc++.h>
using namespace std;
int W, H, A, B;
int fld[1010][1010];
int tm[1010][1010];
int mi[1010][1010];
long long su[1010][1010];
bool usd[1010][1010];
int N;
pair<long long, pair<int, int> > ent[1000010];
bool can[1000010];
int main() {
  while (4 == scanf("%d%d%d%d", &H, &W, &B, &A)) {
    for (int y = 0; y < (int)(H); y++)
      for (int x = 0; x < (int)(W); x++) scanf("%d", &fld[y][x]);
    for (int y = 0; y < (int)(H); y++) {
      deque<pair<int, int> > que;
      for (int x = W - 1; x >= 0; x--) {
        int t = fld[y][x];
        while (!que.empty() && que.back().first >= t) que.pop_back();
        que.push_back(make_pair(t, x));
        while (que.front().second >= x + A) que.pop_front();
        tm[y][x] = que.front().first;
      }
    }
    for (int x = 0; x < (int)(W); x++) {
      deque<pair<int, int> > que;
      for (int y = H - 1; y >= 0; y--) {
        int t = tm[y][x];
        while (!que.empty() && que.back().first >= t) que.pop_back();
        que.push_back(make_pair(t, y));
        while (que.front().second >= y + B) que.pop_front();
        mi[y][x] = que.front().first;
      }
    }
    for (int y = 0; y < (int)(H); y++)
      for (int x = 0; x < (int)(W); x++)
        su[y + 1][x + 1] = su[y + 1][x] + su[y][x + 1] - su[y][x] + fld[y][x];
    N = 0;
    for (int x = 0; x + A <= W; x++) {
      for (int y = 0; y + B <= H; y++) {
        long long c = su[y + B][x + A] - su[y + B][x] - su[y][x + A] + su[y][x];
        c -= mi[y][x] * (long long)A * (long long)B;
        ent[N++] = make_pair(c, make_pair(y, x));
      }
    }
    sort(ent, ent + N);
    memset(usd, 0, sizeof(usd));
    memset(can, 0, sizeof(can));
    int ansn = 0;
    for (int i = 0; i < (int)(N); i++) {
      int x = ent[i].second.second;
      int y = ent[i].second.first;
      if (usd[y][x]) goto ng;
      if (usd[y + B - 1][x]) goto ng;
      if (usd[y][x + A - 1]) goto ng;
      if (usd[y + B - 1][x + A - 1]) goto ng;
      can[i] = true;
      ansn++;
      for (int dx = 0; dx < (int)(A); dx++)
        for (int dy = 0; dy < (int)(B); dy++) usd[y + dy][x + dx] = true;
    ng:;
    }
    printf("%d\n", ansn);
    for (int i = 0; i < (int)(N); i++)
      if (can[i]) {
        printf("%d %d %I64d\n", ent[i].second.first + 1,
               ent[i].second.second + 1, ent[i].first);
      }
  }
}
