#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 1005;
int x[N], y[N], d[N];
vector<int> col[N], row[N];
int get(int c, int dir, int K){
if (dir == 0)
return c - 1;
return 2 * K - 1 - c;
}
pair<int, int> inv(int num, int K){
if (num < K - 1)
return {num + 1, 0};
return {2 * K - 1 - num, 2};
}
void solve(int me, vector<int> &v, int K, int T){
sort(begin(v), end(v), [] (int a, int b){ return x[a] * N + y[a] < x[b] * N + y[b];});
vector<pair<int, int>> vec;
for (int i : v){
int num = get(x[i] + y[i] - me, d[i] & 2, K);
num = (num + T) % (2 * K - 2);
vec.push_back({inv(num, K).first, -num});
}
sort(begin(vec), end(vec));
for (int i=0;i<v.size();i++){
if (row[me] == v)
y[v[i]] = vec[i].first;
else
x[v[i]] = vec[i].first;
d[v[i]] = (d[v[i]] & 1) + inv(-vec[i].second, K).second;
}
}
int main(){
int n, m, k, T;
cin>>n>>m>>k>>T;
for (int i=1;i<=k;i++){
cin>>x[i]>>y[i]>>d[i], d[i]--, x[i]++, y[i]++;
if (d[i] & 1)
row[x[i]].push_back(i);
else
col[y[i]].push_back(i);
}
for (int i=1;i<N;i++)
solve(i, row[i], m+1, T);
for (int i=1;i<N;i++)
solve(i, col[i], n+1, T);
for (int i=1;i<=k;i++)
cout<<x[i] - 1<<" "<<y[i] - 1<<" "<<d[i] + 1<<'\n';
}