#include <bits/stdc++.h>
using namespace std;
const string nameFiles = "";
void error(vector<string>::iterator) {}
template <typename T, typename... Args>
void error(vector<string>::iterator cur_var, T a, Args... args) {
  cerr << cur_var->substr((*cur_var)[0] == ' ') << " = " << a << endl;
  error(++cur_var, args...);
}
vector<string> split(string const& str, char c) {
  vector<string> res;
  stringstream ss(str);
  string x;
  while (getline(ss, x, c)) res.emplace_back(x);
  return move(res);
}
bool used[1000];
int res[1000];
int main() {
  if (!nameFiles.empty()) {
    freopen((nameFiles + ".in").c_str(), "r", stdin);
    freopen((nameFiles + ".out").c_str(), "w", stdout);
  }
  int n;
  set<pair<int, pair<int, int>>> mm;
  cin >> n;
  int x;
  for (int i = 2; i <= 2 * n; ++i) {
    for (int j = 1; j <= i - 1; ++j) {
      cin >> x;
      mm.insert({-x, {i, j}});
    }
  }
  map<int, int> ans;
  for (auto& x : mm) {
    if (!used[x.second.first] && !used[x.second.second]) {
      used[x.second.first] = true;
      used[x.second.second] = true;
      res[x.second.first] = x.second.second;
      res[x.second.second] = x.second.first;
    }
  }
  for (int i = 1; i <= 2 * n; ++i) {
    cout << res[i] << " ";
  }
  return 0;
}
