// #pragma GCC optimize("O3,unroll-loops,Ofast")
// #pragma GCC target("avx2")
#include<bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// using namespace __gnu_pbds;
#define int long long
#define endl '\n'
using namespace std;
using pii = pair<int, int>;
using tup = tuple<int, int, int>;
// mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
// template <class T> using ordered_set = tree<T, null_type,
// less<T>, rb_tree_tag, tree_order_statistics_node_update>;
const int inf = (1e15)+5;
const int mod = 1000000007;
const double eps = 1e-6;
const int N = 200001;
void preprocess() {}
void solve(int tc) {
int n, k;
cin >> n >> k;
vector<string> v(n);
for(string &s : v) cin >> s;
k++;
string ans;
for(int i=0; i+k-1<n; i++) {
string now;
for(int j=0; j<k; j++)
now += v[i+j];
if(now.size() > ans.size()) ans = now;
else if(now.size() == ans.size() && now > ans) ans = now;
}
cout << ans << endl;
}
int32_t main() {
cin.tie(NULL)->sync_with_stdio(false);
cout.precision(10);
preprocess();
int T = 1;
cin >> T;
for (int i = 1; i <= T; i++) {
solve(i);
}
return 0;
}