#include <stdio.h>#include <iostream>#include <string.h>#include <limits.h>#include <algorithm>#include <math.h>#include <numeric>#include <functional>#include <ctype.h>#define MAX 80using namespace std;int mat[MAX][MAX];char dp[MAX][MAX][2*MAX];bool cmp(const char *lhs,const char *rhs){ const int llen=strlen(lhs),rlen=strlen(rhs); if(llen != rlen) return llen<rlen; else for(int i=0;i<llen;++i) if(lhs[i]!=rhs[i]) return lhs[i]<rhs[i]; return false;}int main(void){ int n,m;char temp,ans[2*MAX]; while(scanf("%d%d",&m,&n) &&(n||m)) {memset(mat,-1,sizeof(mat)); memset(dp,' ',sizeof(dp)); memset(ans,' ',sizeof(ans));for(int i=1;i<=n;++i) { getchar();for(int j=1;j<=m;++j){scanf("%c",&temp);if(isdigit(temp))mat[i][j]=temp-'0';elsemat[i][j]=-1;} }for(int i=1;i<=n;++i) {for(int j=1;j<=m;++j) if(mat[i][j]>-1) { int a=strlen(dp[i-1][j]),b=strlen(dp[i][j-1]); if(a&&b) { if(cmp(dp[i-1][j],dp[i][j-1])) { strcpy(dp[i][j],dp[i][j-1]); dp[i][j][b++]=mat[i][j]+'0'; dp[i][j][b]=' '; } else { strcpy(dp[i][j],dp[i-1][j]); dp[i][j][a++]=mat[i][j]+'0'; dp[i][j][a]=' '; } } else if(a) { strcpy(dp[i][j],dp[i-1][j]); dp[i][j][a++]=mat[i][j]+'0'; dp[i][j][a]=' '; } else if(b) { strcpy(dp[i][j],dp[i][j-1]); dp[i][j][b++]=mat[i][j]+'0'; dp[i][j][b]=' '; } else if(mat[i][j]>0) { dp[i][j][0]=mat[i][j]+'0'; } if(cmp(ans,dp[i][j])) strcpy(ans,dp[i][j]); } }printf("%sn",ans); } return 0;}