/* 
   AOJ 1126
   The Secret Number

*/

#include<stdio.h>
#define WH_MAX 70
char field[WH_MAX][WH_MAX];
char target_str[WH_MAX*2] = {'\0'};
int w, h, max_str_n;



int ok(int x, int y)
{
  return 0 <= x && x < w && 0 <= y && y <= h && '0' <= field[y][x] && field[y][x] <= '9';
}

void update_target(char str[], int n)
{
  int i;
  for(i = 0; i < n; i++)
    target_str[i] = str[i];
  max_str_n = n;
}

void update_sec_str(char sec_str[], int secret_n)
{
  int i, j, zero_n = 0;
  char secret_str[secret_n];
  for(i = 0; i < secret_n; i++)
    secret_str[i] = sec_str[i];
  
  for(i = 0; i < secret_n; i++)
    {
      if(secret_str[i] == '0')
	zero_n++;
      else
	break;
    }
  secret_n -= zero_n;

  for(i = 0, j = zero_n; j < secret_n; i++, j++)
    secret_str[i] = secret_str[j];
  secret_str[i] = '\0';


  if(max_str_n < secret_n)
    update_target(secret_str, secret_n);
  else if(max_str_n == secret_n)
    {
      for(i = 0; i < secret_n; i++)
	{
	  if(target_str[i] > secret_str[i])
	    return ;
	  else if(target_str[i] < secret_str[i])
	    update_target(secret_str, secret_n);
	}
    }
}


void dfs(int x, int y, char secret_str[], int secret_n)
{
  if(!ok(x, y))
    {
      update_sec_str(secret_str, secret_n);
      return ;      
    }
  secret_str[secret_n++] = field[y][x];
  secret_str[secret_n] = '\0';
  dfs(x + 1, y, secret_str, secret_n);
  dfs(x, y + 1, secret_str, secret_n);
  return ;
}

void init(void)
{
  int i;
  for(i = 0; i <= max_str_n; i++)
    target_str[i] = '\0';

  max_str_n = 0;

}

int main(void)
{
  int  i, j;
  char secret_str[WH_MAX*2] = {'\0'};
  while(scanf("%d %d", &w, &h), (w && h))
    {
      for(i = 0; i < h; i++)
	{
	  scanf("%s", field[i]);
	}
      for(i = 0; i < h; i++)
	{
	  for(j = 0; j < w; j++)
	    {
	      dfs(j, i, secret_str, 0);
	    }
	}
      printf("%s\n", target_str);
      init();
    }
  return 0;
}