#include <bits/stdc++.h>
using namespace std;
int Q, H, W, K, v[605][605];
int d[17][17];
int windowLength;
void makeAllDists() {
  for (int(i) = (0); (i) < (K); ++(i)) {
    for (int(p) = (0); (p) < (K); ++(p)) {
      if (i == p) continue;
      int fR = H / K * (i + 1) - 1;
      int sR = H / K * p;
      int avg1[605], avg2[605];
      int dist = 0;
      windowLength = min(W / 2, 30);
      for (int(t) = (0); (t) < (W - windowLength + 1); ++(t)) {
        int mn = 300;
        int mx = -1;
        int sum = 0;
        for (int(q) = (0); (q) < (windowLength); ++(q)) {
          sum += v[fR][t + q];
          mn = min(mn, v[fR][t + q]);
          mx = max(mx, v[fR][t + q]);
        }
        avg1[t] = sum - mn - mx;
        mn = 300;
        mx = -1;
        sum = 0;
        for (int(q) = (0); (q) < (windowLength); ++(q)) {
          sum += v[sR][t + q];
          mn = min(mn, v[sR][t + q]);
          mx = max(mx, v[sR][t + q]);
        }
        avg2[t] = sum - mn - mx;
        dist += abs(avg1[t] - avg2[t]);
      }
      d[i][p] = dist;
    }
  }
}
long long bst[70000][17];
int prv[70000][17];
void doDp() {
  for (int(i) = (0); (i) < ((1 << K)); ++(i)) {
    for (int(p) = (0); (p) < (K); ++(p)) {
      bst[i][p] = 1000000010;
    }
  }
  for (int(i) = (0); (i) < (K); ++(i)) {
    bst[(1 << i)][i] = 0;
  }
  for (int(i) = (1); (i) < ((1 << K)); ++(i)) {
    for (int(p) = (0); (p) < (K); ++(p)) {
      if (i & (1 << p)) {
        for (int(t) = (0); (t) < (K); ++(t)) {
          if (!(i & (1 << t))) {
            int newMsk = i | (1 << t);
            int newBst = bst[i][p] + d[p][t];
            if (newBst < bst[newMsk][t]) {
              bst[newMsk][t] = newBst;
              prv[newMsk][t] = p;
            }
          }
        }
      }
    }
  }
  return;
}
int main() {
  scanf("%d", &Q);
  for (int(i) = (0); (i) < (Q); ++(i)) {
    scanf("%d %d %d", &H, &W, &K);
    for (int(i) = (0); (i) < (H); ++(i)) {
      for (int(p) = (0); (p) < (W); ++(p)) {
        scanf("%d", &v[i][p]);
      }
    }
    makeAllDists();
    doDp();
    vector<int> ans;
    int cMsk = (1 << K) - 1;
    int cEnd = 0;
    int cBest = bst[cMsk][0];
    for (int(i) = (1); (i) < (K); ++(i)) {
      if (bst[cMsk][i] < cBest) {
        cBest = bst[cMsk][i];
        cEnd = i;
      }
    }
    while (cMsk != 0) {
      ans.push_back(cEnd);
      int nMsk = cMsk ^ (1 << cEnd);
      cEnd = prv[cMsk][cEnd];
      cMsk = nMsk;
    }
    reverse(ans.begin(), ans.end());
    int othAns[17];
    for (int(i) = (0); (i) < (ans.size()); ++(i)) {
      othAns[ans[i]] = i;
    }
    for (int(i) = (0); (i) < (K); ++(i)) {
      printf("%d ", othAns[i] + 1);
    }
    printf("\n");
  }
  return 0;
}
