#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 10;
long long inf = 1e18;
set<pair<long long, pair<int, int> > > s;
vector<pair<pair<int, int>, long long> > vec;
long long dp[2][maxn][maxn], arr[maxn][maxn];
long long ps[maxn][maxn];
int n, m, a, b;
bool mark[maxn][maxn];
void input() {
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> n >> m >> a >> b;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) cin >> arr[i][j];
}
void cal_ps() {
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
      ps[i + 1][j + 1] = ps[i][j + 1] + ps[i + 1][j] - ps[i][j] + arr[i][j];
}
void cal_dp() {
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) dp[0][i][j] = dp[1][i][j] = inf;
  for (int j = 0; j < m; j++) {
    deque<int> dq;
    for (int i = 0; i < a; i++) {
      while (!dq.empty() && arr[dq.back()][j] >= arr[i][j]) dq.pop_back();
      dq.push_back(i);
    }
    dp[0][a - 1][j] = arr[dq.front()][j];
    for (int i = a; i < n; i++) {
      while (!dq.empty() && arr[dq.back()][j] >= arr[i][j]) dq.pop_back();
      dq.push_back(i);
      if (dq.front() == i - a) dq.pop_front();
      dp[0][i][j] = arr[dq.front()][j];
    }
  }
  for (int i = 0; i < n; i++) {
    deque<int> dq;
    for (int j = 0; j < b; j++) {
      while (!dq.empty() && dp[0][i][dq.back()] >= dp[0][i][j]) dq.pop_back();
      dq.push_back(j);
    }
    dp[1][i][b - 1] = dp[0][i][dq.front()];
    for (int j = b; j < m; j++) {
      while (!dq.empty() && dp[0][i][dq.back()] >= dp[0][i][j]) dq.pop_back();
      dq.push_back(j);
      if (dq.front() == j - b) dq.pop_front();
      dp[1][i][j] = dp[0][i][dq.front()];
    }
  }
}
void init() {
  for (int i = a - 1; i < n; i++)
    for (int j = b - 1; j < m; j++) {
      long long sum = ps[i + 1][j + 1] - ps[i + 1][j + 1 - b] -
                      ps[i + 1 - a][j + 1] + ps[i + 1 - a][j + 1 - b] -
                      a * b * dp[1][i][j];
      s.insert({sum, {i - a + 1, j - b + 1}});
    }
}
bool valid(int x, int y) {
  if (mark[x][y]) return false;
  int xx = max(0, x - a + 1), yy = max(0, y - b + 1);
  for (int i = x + a - 1; i >= xx; i--)
    for (int j = y + b - 1; j >= yy; j--) mark[i][j] = true;
  return true;
}
int main() {
  input();
  cal_ps();
  cal_dp();
  init();
  while (!s.empty()) {
    auto tmp = *s.begin();
    int x = tmp.second.first, y = tmp.second.second;
    long long p = tmp.first;
    if (valid(x, y)) vec.push_back({{x, y}, p});
    s.erase(tmp);
  }
  cout << vec.size() << "\n";
  for (auto tmp : vec) {
    cout << tmp.first.first + 1 << " " << tmp.first.second + 1 << " "
         << tmp.second << "\n";
  }
}
