#pragma comment(linker, "/stack:20000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,sse3,sse4,popcnt,abm,mmx")

#include <bits/stdc++.h>

#define f first
#define s second

#define pb push_back
#define pp pop_back
#define mp make_pair

#define sz(x) (int)x.size()
#define sqr(x) ((x) * 1ll * (x))
#define all(x) x.begin(), x.end()

#define rep(i, l, r) for (int i = l; i <= r; i++)
#define per(i, l, r) for (int i = l; i >= r; i--)

#define dbg(x) cerr << (#x) << " --> " << (x) << nl;
#define Kazakhstan ios_base :: sync_with_stdio(0), cin.tie(0), cout.tie(0);

#define nl '\n'
#define ioi exit(0);

using namespace std;

#ifdef superset
  #include <ext/pb_ds/assoc_container.hpp>
  #include <ext/pb_ds/tree_policy.hpp>
  #include <ext/pb_ds/detail/standard_policies.hpp>

  using namespace __gnu_pbds;
  typedef tree < pair <int, int>, null_type, less < pair <int, int> >, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
#endif

typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;

const int N = 350 + 7, inf = 1e9 + 7, mod = 1e9 + 7;
const ll linf = (ll)1e18 + 7;
const int dx[] = {-1, 0, 1, 0, 1, -1, -1, 1}, dy[] = {0, 1, 0, -1, 1, -1, 1, -1};

int get_int() {
  char x = getchar();
  bool mns = 0;
  while (!isdigit(x)) mns |= x == '-', x = getchar();
  int res = 0;
  while (isdigit(x)) res = res * 10 + x - '0', x = getchar();
  if (mns) res = -res;
  return res;
}
void add(int &x, int y) {
  x += y;
  if (x >= mod) x -= mod;
  if (x < 0) x += mod;
}
int mult(int x, int y) {
  return x * 1ll * y % mod;
}
int sum(int x, int y) {
  add(x, y);
  return x;
}

int n, m, k;
int a[N][N];
ll s[N][N];

ll get(int x1, int y1, int x2, int y2) {
  return s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1];
}
bool z;
bool corr(int x1, int y1, int x2, int y2, int lvl) {
  if (x1 == x2 && y1 == y2) {
    return a[x1][y1] <= lvl;
  }
  rep(i, y1, y2)
    if (a[x1][i] > lvl || a[x2][i] > lvl) return 0;
  rep(i, x1, x2) {
    if (a[i][y1] > lvl || a[i][y2] > lvl) return 0;
  }
  return corr(x1 + 1, y1 + 1, x2 - 1, y2 - 1, lvl + 1);
}
bool check(int x) {
  ll need = 0;
  int len = x * 2 - 1;
  for (int i = len; i >= 1; i -= 2) {
    need += sqr(i);
  }
  for (int i = 1; i <= n - len + 1; i++) {
    for (int j = 1; j <= m - len + 1; j++) {
      if (need - get(i, j, i + len - 1, j + len - 1) <= k && corr(i, j, i + len - 1, j + len - 1, 1)) {
        return 1;
      }
    }
  }
  return 0;
}
void solve() {
  n = get_int(), m = get_int(), k = get_int();
  memset(s, 0, sizeof(s));
  rep(i, 1, n) {
    rep(j, 1, m) {
      a[i][j] = get_int();
      s[i][j] = s[i - 1][j] + s[i][j - 1] + a[i][j] - s[i - 1][j - 1];
    }
  }
  int l = 1, r = min((n + 1) / 2, (m + 1) / 2), res = 0;
  rep(i, l, r)
    if (check(i)) res = i;
  printf ("%d\n", res);
}
int main() {
  #ifdef IOI2018
    #define Toktama ""
    freopen (Toktama".in", "r", stdin);
    //freopen (Toktama".out", "w", stdout);
  #endif
  int T = 1;
  T = get_int();
  while (T--)
    solve();
  ioi
}