#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e3 + 10;
int n, m, a, b;
long long num[MAXN][MAXN], sum[MAXN][MAXN];
int tree[MAXN][MAXN];
long long minnum[MAXN][MAXN], temp[MAXN][MAXN];
long long res[MAXN * MAXN][3], cnt;
struct Node {
  int x, y;
  long long ans;
  bool operator<(const Node &t) const {
    if (ans != t.ans)
      return ans > t.ans;
    else if (x != t.x)
      return x > t.x;
    else
      return y > t.y;
  };
};
int lowbit(int x) { return x & (-x); }
void update(int x, int y, int c) {
  while (x <= n) {
    int ty = y;
    while (ty <= m) {
      tree[x][ty] += c;
      ty += lowbit(ty);
    }
    x += lowbit(x);
  };
  return;
}
int query(int x, int y) {
  int ans = 0;
  while (x) {
    int ty = y;
    while (ty) {
      ans += tree[x][ty];
      ty -= lowbit(ty);
    }
    x -= lowbit(x);
  }
  return ans;
}
priority_queue<Node> pq;
int main() {
  scanf("%d%d%d%d", &n, &m, &a, &b);
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
      scanf("%lld", &num[i][j]);
      sum[i][j] = sum[i - 1][j] + sum[i][j - 1] + num[i][j] - sum[i - 1][j - 1];
    }
  }
  for (int i = 1; i <= n; ++i) {
    deque<int> q;
    for (int j = 1; j <= m; ++j) {
      while (!q.empty() && q.back() <= j - b) q.pop_back();
      while (!q.empty() && num[i][q.front()] >= num[i][j]) q.pop_front();
      q.push_front(j);
      temp[i][j] = num[i][q.back()];
    }
  }
  for (int j = 1; j <= m; ++j) {
    deque<int> q;
    for (int i = 1; i <= n; ++i) {
      while (!q.empty() && q.back() <= i - a) q.pop_back();
      while (!q.empty() && temp[q.front()][j] >= temp[i][j]) q.pop_front();
      q.push_front(i);
      minnum[i][j] = temp[q.back()][j];
    }
  }
  for (int i = a; i <= n; ++i) {
    for (int j = b; j <= m; ++j) {
      long long tot =
          sum[i][j] - sum[i - a][j] - sum[i][j - b] + sum[i - a][j - b];
      tot -= (minnum[i][j] * a * b);
      pq.push({i, j, tot});
    }
  }
  while (!pq.empty()) {
    int x = pq.top().x, y = pq.top().y;
    long long tot = pq.top().ans;
    pq.pop();
    if (query(x, y) || query(x - a + 1, y - b + 1) || query(x - a + 1, y) ||
        query(x, y - b + 1))
      continue;
    res[++cnt][0] = x - a + 1;
    res[cnt][1] = y - b + 1;
    res[cnt][2] = tot;
    update(x - a + 1, y - b + 1, 1);
    update(x + 1, y + 1, 1);
    update(x - a + 1, y + 1, -1);
    update(x + 1, y - b + 1, -1);
  }
  printf("%d\n", cnt);
  for (int i = 1; i <= cnt; ++i) {
    printf("%lld %lld %lld\n", res[i][0], res[i][1], res[i][2]);
  }
  return 0;
}
