#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void check_min(T& a, T b) {
  if (b < a) a = b;
}
template <class T>
inline void check_max(T& a, T b) {
  if (a < b) a = b;
}
vector<pair<int, string> > vs[10010];
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  char s[16];
  int t, c;
  for (int i = 0; i < int(n); ++i) {
    scanf("%s%d%d", s, &t, &c);
    vs[t - 1].push_back(make_pair(-c, s));
  }
  for (int i = 0; i < int(m); ++i) {
    sort((vs[i]).begin(), (vs[i]).end());
    if (int((vs[i]).size()) >= 3 && vs[i][2].first == vs[i][1].first) {
      printf("?\n");
    } else {
      printf("%s %s\n", vs[i][0].second.c_str(), vs[i][1].second.c_str());
    }
  }
  return 0;
}
