#include <bits/stdc++.h>
using namespace std;
template <class T>
void show(T a, int l) {
  for (int i = 1; i <= l; ++i) cout << a[i] << ' ';
  cout << endl;
}
template <class T>
void show(T a, int l, int r) {
  for (int i = 1; i <= l; ++i) show(a[i], r);
  cout << endl;
}
template <class T>
T getMax(T &a, const T &b) {
  return a = max(a, b);
}
const int MAXN = 1009;
int n, m, a, b, mat[MAXN][MAXN], rowm[MAXN][MAXN], recm[MAXN][MAXN];
long long sum[MAXN][MAXN];
int head, tail, deq[MAXN * MAXN], vis[MAXN][MAXN];
const int MAXSET = 1000008;
const long long INF = 1LL << 62;
struct Node {
  int pi, pj;
  long long cost;
  bool operator<(const Node &no) const {
    if (cost == no.cost) {
      if (pi == no.pi)
        return pj < no.pj;
      else
        return pi < no.pi;
    }
    return cost < no.cost;
  }
} node[MAXSET];
int cn, cnt;
int ok[MAXSET];
void dp();
int main() {
  while (scanf("%d%d%d%d", &n, &m, &a, &b) != EOF) {
    int i, j;
    (memset(vis, 0, sizeof(vis)));
    for (i = 1; i <= n; ++i)
      for (j = 1; j <= m; ++j) scanf("%d", &mat[i][j]);
    for (i = n; i >= 1; --i)
      for (j = m; j >= 1; --j) {
        sum[i][j] = 0;
        if (i + 1 <= n) sum[i][j] += sum[i + 1][j];
        if (j + 1 <= m) sum[i][j] += sum[i][j + 1];
        if (i + 1 <= n && j + 1 <= m) sum[i][j] -= sum[i + 1][j + 1];
        sum[i][j] += mat[i][j];
      }
    dp();
    cn = 0;
    for (i = 1; i <= n; ++i)
      for (j = 1; j <= m; ++j) {
        if (i + a - 1 <= n && j + b - 1 <= m) {
          node[cn].pi = i, node[cn].pj = j;
          node[cn].cost = sum[i][j];
          if (i + a <= n) node[cn].cost -= sum[i + a][j];
          if (j + b <= m) node[cn].cost -= sum[i][j + b];
          if (i + a <= n && j + b <= m) node[cn].cost += sum[i + a][j + b];
          node[cn].cost -= (long long)recm[i][j] * a * b;
          ++cn;
        }
      }
    sort(node, node + cn);
    int cnt = 0;
    for (int k = 0; k < cn; ++k) {
      if (!vis[node[k].pi][node[k].pj]) {
        ok[cnt++] = k;
        for (i = max(1, node[k].pi - a + 1); i <= min(n, node[k].pi + a - 1);
             ++i)
          for (j = max(1, node[k].pj - b + 1); j <= min(m, node[k].pj + b - 1);
               ++j)
            vis[i][j] = 1;
      }
    }
    printf("%d\n", cnt);
    for (int k = 0; k < cnt; ++k)
      printf("%d %d %I64d\n", node[ok[k]].pi, node[ok[k]].pj, node[ok[k]].cost);
  }
  return 0;
}
void dp() {
  for (int i = 1; i <= n; ++i) {
    head = tail = 0;
    for (int j = m; j >= 1; --j) {
      while (tail - head >= 1 && mat[i][j] <= mat[i][deq[tail - 1]]) --tail;
      deq[tail++] = j;
      while (tail - head >= 1 && deq[head] - j + 1 > b) ++head;
      rowm[i][j] = mat[i][deq[head]];
    }
  }
  for (int j = 1; j <= m; ++j) {
    head = tail = 0;
    for (int i = n; i >= 1; --i) {
      while (tail - head >= 1 && rowm[i][j] <= rowm[deq[tail - 1]][j]) --tail;
      deq[tail++] = i;
      while (tail - head >= 1 && deq[head] - i + 1 > a) ++head;
      recm[i][j] = rowm[deq[head]][j];
    }
  }
}
