#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct node {
string name;
int height;
};
int cmp(struct node a, struct node b) {
return a.height != b.height ? a.height > b.height : a.name < b.name;
}
int main() {
int n, k, m;
cin >> n >> k;//N是总人数 一共有K排
vector<node> stu(n);//stu存放所有学生信息
for(int i = 0; i < n; i++) {
cin >> stu[i].name >> stu[i].height;
}
//身高从大到小排列
sort(stu.begin(), stu.end(), cmp);
//排序后第一个学生是最高的,t从最高的学生开始
int t = 0, row = k;
//row从最后一排(第一行)开始,不断往前
while(row) {
if(row == k)//如果是最后一排(第一行)
//总人数 - 前面的排数(k-1) * 前面每一排的人数(n/k)
m = n - n / k * (k - 1);//m代表这一行的人数
else
m = n / k;
vector<string> ans(m);//ans存放当前排的学生
ans[m / 2] = stu[t].name;//最中间的学生最高的
// 左边一列,从中间到最左边
int j = m / 2 - 1;
for(int i = t + 1; i < t + m; i = i + 2)
ans[j--] = stu[i].name;
// 右边一列,从中间到最右边
j = m / 2 + 1;
for(int i = t + 2; i < t + m; i = i + 2)
ans[j++] = stu[i].name;
// 输出当前排
cout << ans[0];
for(int i = 1; i < m; i++)
cout << " " << ans[i];
cout << endl;
t = t + m;
row--;
}
return 0;
}