#include <bits/stdc++.h>
using namespace std;
int setBite(int N, int pos) { return N = N | (1 << pos); }
int resetBit(int N, int pos) { return N = N & ~(1 << pos); }
bool checkBit(int N, int pos) { return (N & (1 << pos)); }
bool leap(long long x) {
  if ((x % 4 == 0 && x % 100 != 0) || x % 400 == 0) return true;
  return false;
}
long long bigmod(long long a, long long b, long long mod) {
  if (b == 0) return 1;
  if (b % 2 == 0) {
    long long ret = bigmod(a, b / 2, mod);
    return ((ret % mod) * (ret % mod)) % mod;
  } else
    return ((a % mod) * (bigmod(a, b - 1, mod) % mod)) % mod;
}
template <class T>
inline T gcd(T a, T b) {
  if (a < 0) return gcd(-a, b);
  if (b < 0) return gcd(a, -b);
  return (b == 0) ? a : gcd(b, a % b);
}
template <class T>
inline T lcm(T a, T b) {
  if (a < 0) return lcm(-a, b);
  if (b < 0) return lcm(a, -b);
  return a * (b / gcd(a, b));
}
template <class T>
inline T sqr(T x) {
  return x * x;
}
template <class T>
inline T power(T N, T P) {
  T ans = 1;
  for (T i = 0; i < P; i++) {
    ans *= N;
  }
  return ans;
}
int main() {
  vector<pair<int, pair<int, int> > > v;
  int n;
  scanf("%d", &n);
  for (int i = 2; i <= n * 2; i++) {
    for (int j = 1; j < i; j++) {
      int a;
      scanf("%d", &a);
      v.push_back(make_pair(a, make_pair(i, j)));
    }
  }
  map<int, int> m;
  sort(v.rbegin(), v.rend());
  int cnt = 0;
  int a[2 * n + 1];
  for (int i = 0; i < v.size(); i++) {
    if (m[v[i].second.first] == 0 && m[v[i].second.second] == 0) {
      a[v[i].second.first] = v[i].second.second;
      a[v[i].second.second] = v[i].second.first;
      m[v[i].second.first]++;
      m[v[i].second.second]++;
      cnt++;
    }
    if (cnt == n) {
      break;
    }
  }
  for (int i = 1; i <= n * 2; i++) {
    printf("%d ", a[i]);
  }
  return 0;
}
