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

}