#include <bits/stdc++.h>
using namespace std;
int a[1010][1010], b[1010][1010], n, m, r, c;
long long s[1010][1010];
bool vis[1010][1010];
struct node {
  int x, y;
  long long v;
  bool operator<(const node &p) const {
    if (v != p.v) return v < p.v;
    if (x != p.x) return x < p.x;
    return y < p.y;
  }
} p[1010 * 1010];
int main() {
  scanf("%d%d%d%d", &n, &m, &r, &c);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      scanf("%d", &a[i][j]), s[i][j] += s[i][j - 1] + a[i][j];
  for (int i = 1; i <= m; i++)
    for (int j = 1; j <= n; j++) s[j][i] += s[j - 1][i];
  for (int i = 1; i <= n; i++) {
    multiset<int> st;
    for (int j = 1; j <= m; j++) {
      if (j > c) st.erase(st.find(a[i][j - c]));
      st.insert(a[i][j]);
      b[i][j] = *st.begin();
    }
  }
  for (int i = 1; i <= m; i++) {
    multiset<int> st;
    for (int j = 1; j <= n; j++) {
      if (j > r) st.erase(st.find(b[j - r][i]));
      st.insert(b[j][i]);
      a[j][i] = *st.begin();
    }
  }
  int cnt = 0;
  for (int i = r; i <= n; i++)
    for (int j = c; j <= m; j++) {
      long long tmp = s[i][j] - s[i - r][j] - s[i][j - c] + s[i - r][j - c];
      p[cnt++] = (node){i, j, tmp - (long long)a[i][j] * (long long)r * c};
    }
  sort(p, p + cnt);
  int num = 0;
  for (int i = 0; i < cnt; i++)
    if (!vis[p[i].x][p[i].y]) {
      for (int x = min(p[i].x + r - 1, n); x > p[i].x - r; x--)
        for (int y = min(p[i].y + c - 1, m); y > p[i].y - c; y--) vis[x][y] = 1;
      p[num++] = p[i];
    }
  cout << num << endl;
  for (int i = 0; i < num; i++)
    printf("%d %d %I64d\n", p[i].x - r + 1, p[i].y - c + 1, p[i].v);
  return 0;
}
