#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:256000000")
using namespace std;
const long double PI = acosl((long double)-1.0);
const long long LINF = 1e18;
const int MOD = 1000003;
const int MAXN = 605;
inline int mul(int a, int b, int MOD) { return long long(a) * b % MOD; }
inline int add(int a, int b, int MOD) {
  int res = a + b;
  if (res >= MOD) {
    res -= MOD;
  }
  return res;
}
inline int bin_pow(int a, int b, int MOD) {
  int res = 1;
  while (b) {
    if (b & 1) {
      res = mul(res, a, MOD);
    }
    b >>= 1;
    a = mul(a, a, MOD);
  }
  return res;
}
const int BUBEN = 1;
int n, m, k;
int pix[MAXN][MAXN];
int pix0[MAXN][MAXN];
int prv[1 << 16][17];
double dp[1 << 16][17];
double nxt[17][17];
int s[17][17];
int pos[17];
void init() {
  scanf("%d%d%d", &n, &m, &k);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      scanf("%d", &pix[i][j]);
    }
  }
}
inline bool valid(int x, int y) { return 1 <= x && x <= n && 1 <= y && y <= m; }
void degradation() {
  memcpy(pix0, pix, sizeof(pix));
  int l = 1, r = n / k;
  for (int i = 1; i <= n; i++) {
    if (i > r) {
      l += n / k;
      r += n / k;
    }
    for (int j = 1; j <= m; j++) {
      int sum = 0;
      int cnt = 0;
      for (int dx = -BUBEN; dx <= BUBEN; dx++) {
        if (i + dx < l || i + dx > r) {
          continue;
        }
        for (int dy = -BUBEN; dy <= BUBEN; dy++) {
          if (valid(i + dx, j + dy)) {
            cnt++;
            sum += pix0[i + dx][j + dy];
          }
        }
      }
      pix[i][j] = (sum + cnt / 2) / cnt;
    }
  }
}
int summ_dif(int num1, int num2) {
  int sum = 0;
  for (int i = 1; i <= m; i++) {
    sum += abs(pix[num1][i] - pix[num2][i]);
  }
  return sum;
}
void calc_probabilities() {
  for (int i = 1; i <= k; i++) {
    double dsum = 0.0;
    for (int j = 1; j <= k; j++) {
      if (i == j) {
        continue;
      }
      s[i][j] = summ_dif(i * (n / k), (j - 1) * (n / k) + 1);
      dsum += 1.0 / s[i][j];
    }
    for (int j = 1; j <= k; j++) {
      if (i == j) {
        continue;
      }
      nxt[i][j] = 1.0 / s[i][j] / dsum;
    }
  }
}
void calc_dp() {
  memset(dp, 0, sizeof(dp));
  for (int i = 1; i <= k; i++) {
    dp[1 << i - 1][i] = 1.0 / k;
  }
  for (int mask = 1; mask + 1 < (1 << k); mask++) {
    for (int l = 1; l <= k; l++) {
      if (!(mask & (1 << l - 1))) {
        continue;
      }
      for (int i = 1; i <= k; i++) {
        if (!(mask & (1 << i - 1)) && i != l) {
          int nmask = mask | (1 << i - 1);
          if (dp[nmask][i] < dp[mask][l] * nxt[l][i]) {
            dp[nmask][i] = dp[mask][l] * nxt[l][i];
            prv[nmask][i] = l;
          }
        }
      }
    }
  }
}
void print() {
  int p = 1;
  for (int i = 2; i <= k; i++) {
    if (dp[(1 << k) - 1][i] > dp[(1 << k) - 1][p]) {
      p = i;
    }
  }
  int mask = (1 << k) - 1;
  for (int num = k; num >= 1; num--) {
    pos[p] = num;
    int nxt = prv[mask][p];
    mask ^= (1 << p - 1);
    p = nxt;
  }
  for (int i = 1; i <= k; i++) {
    printf("%d ", pos[i]);
  }
  printf("\n");
}
void solve() {
  init();
  degradation();
  calc_probabilities();
  calc_dp();
  print();
}
void precalc() {}
int main() {
  srand(25);
  precalc();
  int tests = 1;
  scanf("%d", &tests);
  for (int i = 1; i <= tests; i++) {
    solve();
  }
  return 0;
}
