#include <bits/stdc++.h>

using namespace std;

#define MP make_pair
#define PB push_back
#define upto(i,n) for(int i = 0; (i)<(n); i++)
#define REP(i,n) upto(i,n)
#define FOR(i,a,b) for(int (i) = (a); i<=(b); i++)
#define RI(a) scanf("%d", &a);
#define DRI(a) int a; scanf("%d", &a);
typedef long long ll;
typedef vector<int> vi;
#define DEB(x) cerr << ">>>" << (#x) << " -> " << (x) << endl;

const int MAXN = 1002;
struct s{
  char c;
  int sq, denom, nom;
  int isNum;
  bool op;
  int num;
};

s A[MAXN][MAXN];

void setNum(int &i, int &j) {
  int x = i, y = j;
  int n = 0;
  while(A[i][j].c >= '0' && A[i][j].c <= '9' ) {
    n *= 10;
    n += A[i][j].c - '0';
    j++;
  }
  A[x][y].num = n;
  A[x][y].isNum = true;
}

int R,C;
//int getNum(int i, int & j ) {
//   while ( !A[i][j].isNum && j <= C) j++;
//   return A[i][j].num;
//}
//
//char getOP(int i, int & j) {
//  while ( A[i][j].op == false  j <= C) j++;
//  return A[i][j].c;
//}

int Eval(int r, int j, int end) {
  int sum = 0;
  int prev, n;

  deque<char> ss;
  deque<int> nums;
  for(int i = j; i<end; i++) {
    if ( A[r][i].isNum ) nums.push_back( A[r][i].num );
    if ( A[r][i].op ) {
      if ( ss.size() && ss.back() == '*' ) {
        int x = nums.back(); nums.pop_back();
	int y = nums.back(); nums.pop_back();
	nums.push_back(x*y);
	ss.pop_back();
      }
      ss.push_back(A[r][i].c );
    }
  }
  //DEB(ss.size());
  //DEB(nums.size());
  if ( ss.size() && ss.front () == '*' ) {
    int x = nums.back(); nums.pop_back();
    int y = nums.back(); nums.pop_back();
    nums.push_back(x*y);
    ss.pop_back();
  }

  for ( int ii = 0; ii< ss.size(); ii++ ) {
    int x = nums[0];
    int y = nums[1];
    nums.pop_front();
    char c = ss[ii];
    if ( c == '+' )
      nums[0] = x+y;
    if ( c == '-' )
      nums[0] = x-y;
  }
  //vi s2(ss.begin(), ss.end());
  //DEB( nums.size() );
  //DEB(nums[0]);

  return nums[0];
}

void subsSQ(int i, int j ) {
  int x = i, y = j;
  int end = j;
  while ( A[i][end].sq == 1 ) end++;

  int n = Eval(i,j,end);

  for(int kk = y; kk< end; kk++)
    memset(&A[x][kk], 0, sizeof(s));

  //cerr << "SQRT : " << sqrt(n) << endl;
  A[x][y].isNum = true;
  A[x][y].num = sqrt(n);
}

void subsZL(int i, int j){
  int x = i, y = j;
  int end = j;
  while ( A[i][end].c == '=' ) end++;
  int n1 = Eval(x-1, y, end);
  //DEB(n1);
  int n2 = Eval(x+1, y, end);
  //DEB(n2);

  
  for(int kk = y; kk< end; kk++) {
    memset(&A[x-1][kk], 0, sizeof(s));
    memset(&A[x][kk], 0, sizeof(s));
    memset(&A[x+1][kk], 0, sizeof(s));
   }
  A[x][y].isNum = true;
  A[x][y].num = n1/n2;
  
  //DEB(A[x][y].num);
  //DEB(x);
  //DEB(y);
}

int solve(int r, int c) {
  FOR(i,1,r) {
    FOR(j,1,c) {
      if ( A[i][j].c >= '0' && A[i][j].c <= '9' )
        setNum(i,j);
    }
  } //parse NUBMERS
  //SUBS SQRT A ZLOMKY
  FOR(i,1,r) {
    FOR(j,1,c) {
      if ( A[i][j].sq == 1 ) subsSQ(i,j);
      if ( A[i][j].c == '=' ) subsZL(i,j);
    }
  }
  int res = 0;
  if ( r == 1 ) res = 1;
  if ( r == 2 ) res = 2;
  if ( r == 3 ) res = 2;
  //FOR(xxx, 1, r ) {
  //  FOR(yyy, 1, c) {
  //    if ( A[xxx][yyy].isNum ) cout << A[xxx][yyy].num << " ";
  //    else                     cout << "X";
  //  }
  //  cout << endl;
  //}
  return Eval(res, 1, c+1);
}

int main() {
  int r, c;
  string line;
  

  while ( cin >> r >> c && r+c) {
    R = r;
    C = c;
    memset(A, 0, sizeof(A));
    cin.get();
    FOR(i, 1, r ) {
      getline(cin, line);
      FOR(j,1,c ) {
        A[i][j].c = line[j-1];
	if ( A[i][j].c == '-' || A[i][j].c == '+' || A[i][j].c == '*' )
	  A[i][j].op = true;
	if ( A[i][j].c == '_' ) A[i+1][j].sq = 1;
        if ( A[i][j].c == '=' ) {
          A[i-1][j].nom   = 1;
	  A[i+1][j].denom = 1;
	}
      }
    }
    cout << solve(r,c) << endl;
    //cerr << "END" << endl;
  }




  return 0;
}