#include <bits/stdc++.h>
void fre() {
  freopen("c://test//input.in", "r", stdin);
  freopen("c://test//output.out", "w", stdout);
}
template <class T>
inline void gmax(T &a, T b) {
  if (b > a) a = b;
}
template <class T>
inline void gmin(T &a, T b) {
  if (b < a) a = b;
}
using namespace std;
const int N = 0, M = 0, Z = 1e9 + 7, maxint = 2147483647, ms31 = 522133279,
          ms63 = 1061109567, ms127 = 2139062143;
const double eps = 1e-8, PI = acos(-1.0);
map<int, int> mop;
struct A {
  int x, y, z;
  bool operator<(const A b) const { return z > b.z; }
} a[640000];
bool e[804];
int f[804];
int n;
int main() {
  while (~scanf("%d", &n)) {
    int m = 0;
    for (int i = 2; i <= 2 * n; i++) {
      for (int j = 1; j < i; j++) {
        ++m;
        a[m].x = j;
        a[m].y = i;
        scanf("%d", &a[m].z);
      }
    }
    memset(e, 1, sizeof(e));
    sort(a + 1, a + m + 1);
    for (int i = 1; i <= m; i++) {
      int x = a[i].x;
      int y = a[i].y;
      if (e[x] && e[y]) {
        f[x] = y;
        f[y] = x;
        e[x] = 0;
        e[y] = 0;
      }
    }
    for (int i = 1; i <= 2 * n; i++) printf("%d ", f[i]);
    puts("");
  }
  return 0;
}
