#include <bits/stdc++.h>
using namespace std;
const int INF = INT_MAX / 3;
template <typename T>
void gv(vector<T>& a) {
  for (int h = 0; h < a.size(); h++) scanf("%d", &a[h]);
}
void gv(vector<pair<int, int> >& a) {
  int b, c;
  for (int h = 0; h < a.size(); h++) {
    scanf("%d %d", &b, &c);
    a[h].first = b;
    a[h].second = c;
  }
}
int max(int a, int b) { return a > b ? a : b; }
void pnt(vector<int> a, int n) {
  for (int h = 0; h < n; h++) cout << a[h] << " ";
  cout << "\n";
}
void pnt(vector<pair<int, int> > a, int n) {
  for (int h = 0; h < a.size(); h++) {
    printf("%d ", a[h].first);
  }
  printf("\n");
  for (int h = 0; h < a.size(); h++) {
    printf("%d ", a[h].second);
  }
  return;
}
template <typename T>
void pnt(vector<T> a) {
  if (a.size() == 0) cout << "\n";
  for (int h = 0; h < a.size() - 1; h++) printf("%d ", a[h]);
  printf("%d\n", a.back());
}
void pnt(vector<vector<int> > a) {
  for (int h = 0; h < a.size(); h++) pnt(a[h]);
}
void pnt(vector<vector<pair<int, int> > > a) {
  for (int h = 0; h < a.size(); h++) {
    for (int j = 0; j < a[h].size(); j++) {
      printf("%d %d\n", a[h][j].first, a[h][j].second);
    }
    printf("\n");
  }
  return;
}
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
int main() {
  int n;
  cin >> n;
  int t;
  map<int, pair<int, int>, greater<int> > pq;
  for (int i = 1; i < 2 * n; i++) {
    for (int j = 0; j < i; j++) {
      cin >> t;
      pq[t] = make_pair(i + 1, j + 1);
    }
  }
  vector<int> a(2 * n);
  int ca = 0;
  while (ca < 2 * n) {
    pair<int, int> p = pq.begin()->second;
    pq.erase(pq.begin());
    if (a[p.first - 1] == 0 && a[p.second - 1] == 0) {
      ca += 2;
      a[p.first - 1] = p.second;
      a[p.second - 1] = p.first;
    }
  }
  pnt(a);
  return 0;
}
