#include <iostream>
#include <vector>
using namespace std;
const int N = 1<<10;
string A[N];
int n, m;
vector<int> dfs(int i, int j);
vector<int> traverse_path(int i, int j, int lst){
if ((A[i][j] == '|' or A[i][j] == '+') and A[i+1][j] == '-'){
i++;
while (A[i][j] != '+')
j--;
return dfs(i, j);
}
if (A[i][j] == '|')
return traverse_path(i+1, j, j);
else if (A[i][j] == '-' and lst == j + 1)
return traverse_path(i, j-1, j);
else if (A[i][j] == '-')
return traverse_path(i, j+1, j);
else if (A[i][j] == '+'){
if (lst == j and j > 0 and A[i][j-1] != '.')
return traverse_path(i, j-1, j);
else if (lst == j)
return traverse_path(i, j+1, j);
else
return traverse_path(i+1, j, j);
}
}
int getID(int I, int J, int ans){
for (int i=I+1; ans == 0; i++){
for (int j=J+1;A[i][j] != '|';j++){
if (isdigit(A[i][j]))
ans = ans * 10 + A[i][j] - '0';
}
}
return ans;
}
vector<int> dfs(int i, int j){
int x = getID(i, j, 0);
int J = j+1, I = i+1;
while (A[i][J] == '-')
J++;
while (A[I][j] == '|')
I++;
vector<int> vec, v;
while (I > i + 1){
I--;
v = {};
if (j > 0 and A[I][j-1] != '.')
v = traverse_path(I, j-1, j);
else if (J + 1 < m and A[I][J+1] != '.')
v = traverse_path(I, J+1, j);
vec.insert(vec.end(), v.begin(), v.end());
}
vec.push_back(x);
return vec;
}
int main(){
cin>>n>>m;
for (int i=0;i<n;i++)
cin>>A[i];
for (int i=0;i<n;i++){
for (int j=0;j<m;j++){
if (A[i][j] == '+'){
for (int k : dfs(i, j))
cout<<k<<'\n';
return 0;
}
}
}
}