#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 ;     }   }   