#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
const int N = 400'000 + 10;
int n, k;
pair<int, int> buga[N][2];
vector<int> save[N];
int32_t main() {
cin.tie(0)->sync_with_stdio(0);
cin >> n >> k;
for (int i = 1; i <= n; ++i) {
cin >> buga[i][0].first >> buga[i][1].first;
cin >> buga[i][0].second >> buga[i][1].second;
}
array<vector<int>, 2> arr;
for (int dir = 0; dir < 2; ++dir) {
vector<int> allP;
for (int i = 1; i <= n; ++i) {
const auto& [l, r] = buga[i][dir];
allP.push_back(l);
allP.push_back(r);
}
sort(allP.begin(), allP.end());
allP.erase(unique(allP.begin(), allP.end()), allP.end());
using pii = pair<int, int>;
priority_queue<pii, vector<pii>, greater<>> pq;
for (int i = 1; i <= n; ++i) {
auto [l, r] = buga[i][dir];
l = lower_bound(allP.begin(), allP.end(), l) - allP.begin();
r = lower_bound(allP.begin(), allP.end(), r) - allP.begin();
pq.push({r, l});
}
vector<int> vt;
while (pq.size()) {
auto [r, l] = pq.top(); pq.pop();
if (vt.size() && l <= vt.back()) continue;
vt.push_back(r);
}
for (const auto& x : vt) arr[dir].push_back(allP[x]);
if (!arr[dir].size()) arr[dir].push_back(1);
}
assert((int)(arr[0].size() * arr[1].size()) <= k);
vector<pair<int, int>> answer;
for (const auto& x : arr[0]) {
for (const auto& y : arr[1]) {
cout << x << " " << y << "\n";
k -= 1;
answer.push_back({x, y});
}
}
while (k--) {
cout << 1 << " " << 1 << "\n";
answer.push_back({1, 1});
}
for (int i = 1; i <= n; ++i) {
bool found = false;
auto [l, r] = buga[i][0];
auto [d, u] = buga[i][1];
for (const auto& [x, y] : answer) {
if (l <= x && x <= r && d <= y && y <= u) {
found = true;
break;
}
}
assert(found);
}
}