#include <bits/stdc++.h>
#pragma GCC optimize("-Ofast")
#pragma GCC target( \
    "sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
#pragma GCC optimize("unroll-loops")
using namespace std;
template <typename T>
void chkmax(T &first, T second) {
  first < second ? first = second : T();
}
template <typename T>
void chkmin(T &first, T second) {
  second < first ? first = second : T();
}
template <typename T>
void readint(T &first) {
  first = 0;
  int f = 1;
  char c;
  for (c = getchar(); !isdigit(c); c = getchar())
    if (c == '-') f = -1;
  for (; isdigit(c); c = getchar()) first = first * 10 + (c - '0');
  first *= f;
}
template <typename T>
T divceil(T first, T second) {
  return (first - 1) / second + 1;
}
int n, k, c[10005], last[105], cnt[105], f[105];
struct interval {
  interval(int _c, int _l, int _r) : c(_c), l(_l), r(_r) {}
  interval() = default;
  int c, l, r;
};
vector<interval> V[105];
interval ans[105];
bool cmp(interval &i1, interval &i2) { return i1.r < i2.r; }
int main() {
  cin >> n >> k;
  for (int i = 0; i < n; ++i) {
    last[i] = -1;
    cnt[i] = 0, f[i] = 0;
  }
  for (int i = 0; i < n * k; ++i) {
    readint(c[i]), --c[i];
    if (last[c[i]] >= 0) {
      V[cnt[c[i]]++].push_back(interval(c[i], last[c[i]] + 1, i + 1));
    }
    last[c[i]] = i;
  }
  memset(f, 0, sizeof(f));
  int b = divceil(n, k - 1);
  for (int i = 0; i < k; ++i) {
    sort(V[i].begin(), V[i].end(), cmp);
    int n_selected = 0;
    for (auto &itv : V[i]) {
      if (!f[itv.c] && n_selected < b) {
        ans[itv.c] = itv;
        f[itv.c] = 1;
        ++n_selected;
      }
    }
  }
  for (int i = 0; i < n; ++i) {
    printf("%d %d\n", ans[i].l, ans[i].r);
  }
  return 0;
}
