/*
dp[i][j]表示到[i,j]的权值
cnt[i,j]表示到[i,j]还可以使用的修改的次数
cnt[i,j]=max(cnt[i-1,j],cnt[i,j-1])
如果mp[i,j]!='a',cnt[i,j]--,没得减就赋值dp[i,j],最后找到最小的dp[i,j]输出
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 2005
#define INF 0x3f3f3f3f
int n,k,dp[maxn][maxn],cnt[maxn][maxn];
char mp[maxn][maxn];
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++)
scanf("%s",mp[i]+1);
for(int i=0;i<=n;i++)
dp[0][i]=dp[i][0]=INF;
cnt[1][0]=cnt[0][1]=k;dp[0][1]=dp[1][0]=0;
for(int k=1;k<=2*n-1;k++){
int Min=INF;
for(int i=1;i<=n;i++){
int j=k-i+1;
if(j<=0 || j>n)continue;
cnt[i][j]=max(cnt[i-1][j],cnt[i][j-1]);
if(cnt[i][j]){//还可以修改
if(mp[i][j]!='a')cnt[i][j]--;
dp[i][j]=0;
}
else {
dp[i][j]=min(dp[i-1][j],dp[i][j-1]);
if(dp[i][j]!=INF)dp[i][j]=mp[i][j]-'a';
}
Min=min(Min,dp[i][j]);
}
cout<<(char)(Min+'a');
for(int i=1;i<=n;i++){
int j=k-i+1;
if(j<=0 || j>n)continue;
if(dp[i][j]!=Min)dp[i][j]=INF;
}
}
puts("");
/*for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
cout<<dp[i][j]<<" ";
puts("");
}*/
return 0;
}