#include using namespace std; const int INF = 100000; int main(){ int H, W; cin >> H >> W; vector> S(H, vector(W)); for (int i = 0; i < H; i++){ for (int j = 0; j < W; j++){ cin >> S[i][j]; } } vector cnt(H + W - 1, 0); vector> x(H + W - 1), y(H + W - 1); vector> id(H, vector(W)); for (int i = 0; i < H; i++){ for (int j = 0; j < W; j++){ id[i][j] = cnt[i + j]; cnt[i + j]++; x[i + j].push_back(i); y[i + j].push_back(j); } } vector>> E(H + W - 1); for (int i = 0; i < H + W - 1; i++){ E[i].resize(cnt[i]); } for (int i = 0; i < H; i++){ for (int j = 0; j < W; j++){ if (i < H - 1){ E[i + j][id[i][j]].push_back(id[i + 1][j]); } if (j < W - 1){ E[i + j][id[i][j]].push_back(id[i][j + 1]); } } } vector> dp(H + W - 1); vector> nxt(H + W - 1); for (int i = 0; i < H + W - 1; i++){ dp[i].resize(cnt[i]); nxt[i].resize(cnt[i]); } dp[H + W - 2][0] = 0; for (int i = H + W - 3; i >= 0; i--){ vector> P(cnt[i]); for (int j = 0; j < cnt[i]; j++){ int mn = INF; for (int k : E[i][j]){ mn = min(mn, dp[i + 1][k]); } P[j] = make_pair(S[x[i][j]][y[i][j]], mn); for (int k : E[i][j]){ if (dp[i + 1][k] == mn){ nxt[i][j] = k; } } } vector> P2 = P; sort(P2.begin(), P2.end()); P2.erase(unique(P2.begin(), P2.end()), P2.end()); for (int j = 0; j < cnt[i]; j++){ dp[i][j] = lower_bound(P2.begin(), P2.end(), P[j]) - P2.begin(); } } string ans; int p = 0; for (int i = 0; i < H + W - 1; i++){ ans += S[x[i][p]][y[i][p]]; if (i < H + W - 2){ p = nxt[i][p]; } } cout << ans << endl; }