#include <algorithm>
#include <functional>
#include <iostream>
#include <unordered_map>
#include <utility>
#include <vector>
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m, k, l, d;
cin >> n >> m >> k >> l >> d;
// 老师只能尽力分割,但是很可能还有人分不开,目标是取得尽可能多的人被分开
// 对横向纵向分别进行最优化处理
// 判断有几个是横向说话人:记录他们的列,哪几个是纵向说话人:记录他们的行
// 然后在横向说话人这一块,把列数重复最高的先给分开,将其压入数组
// 纵向则是把行数重复最高的先分开,将其压入数组
// 然后排序两个数组,先输出纵向的,再输出横向的
// 卡点:如何记录相同行数的次数,并进行排序
// 用列表是最方便的,就使用结构体数组,记录下他们的列数行数和出现的次数,然后进行次数降序排序
// 取最大的次数,然后输出它存储的x/y值
unordered_map<int, int> row, column; // 记录同行或者同列次数
for (int i = 0; i < d; i++) {
int r1, r2;
int c1, c2;
cin >> r1 >> c1 >> r2 >> c2;
if (r1 == r2) {
++row[min(c1, c2)]; // 同行
}
else if (c1 == c2) {
++column[min(r1, r2)]; // 同列
}
}
vector<pair<int, int>> r_l, c_l; // 使用双重数组记录键和值
for(auto & a: row){
r_l.emplace_back(a.second, a.first);// emplace_back接受零件,push_back只接受整体
}
for(auto & a: column){
c_l.emplace_back(a.second, a.first);// emplace_back接受零件,push_back只接受整体
}
sort(r_l.begin(),r_l.end(),greater<pair<int,int> >());
sort(c_l.begin(),c_l.end(),greater<pair<int,int> >());
vector<int> rows, cols;
for (int i = 0; i < l && i < r_l.size(); i++) {
rows.push_back(r_l[i].second);
}
for (int i = 0; i < k && i < c_l.size(); i++) {
cols.push_back(c_l[i].second);
}
sort(rows.begin(), rows.end());
sort(cols.begin(), cols.end());
for(int &i : cols){
cout << i << " ";
}
cout << '\n';
for(int &i : rows){
cout << i << " ";
}
}
