#include <iostream>
#include <iomanip>
#include <vector>
#include <limits>
#include <algorithm>
#include <cctype>
#include <cmath>
#include <queue>
#include <set>
#include <bitset>
#include <map>
#include <cstdlib>
#include <cstring>
#include <sstream>

#define REP(i, n) for(int i=0;i<(n);++i)
#define REPE(i, n) for(int i=0;i<=(n);++i) 
#define REPA(i, a, b) for(int i=(a);i<(b);++i)
#define REPAE(i, a, b) for(int i=(a);i<=(b);++i) 

using namespace std;

typedef unsigned long long int ULINT;
typedef long long int LINT;
typedef pair<int,int> PPI;

int rows, cols;
string grid[3];

int ind;

int read_num(int row, int & leind) {
	int num = 0;
	while(isdigit(grid[row][leind])) {
	num = num * 10 + grid[row][leind] - '0';
	leind++;
	}
	leind++;
	return num;
}

int eval_simple(int row, int start, int & leind, int len) {
	char c;
	
	int res = read_num(row, leind);
	for(;;) {
		c = grid[row][leind];
		if(c == '*') {
			leind += 2;
			int num = read_num(row, leind);
			res *= num;		
		}
		else break;
	}
	
	if(leind - start < len) {
		c = grid[row][leind];
		if(c == '+') {
			leind += 2;
			int num2 = eval_simple(row, start, leind, len);
			res += num2;
		}
		else if(c == '-') {
			leind += 2;
			int num2 = eval_simple(row, start, leind, len);
			res -= num2;
		}	
	}
	
	return res;	
}


int eval_frac(int row) {
	int len = 0;
	int top;
	int bot;
	bool topok = false;
	bool botok = false;
	
	for(int i = ind; i < cols; ++i) {
		if(grid[1][i] == '=') {
			len++;
		}
		else break;	
	}
	for(int i = ind; i < cols; ++i) {
		if(!topok && grid[0][i] != ' ') {
				int foo_ind = i;
				top = eval_simple(0, foo_ind, foo_ind, len);
				topok = true;
			}
		if(!botok && grid[2][i] != ' ') {
			int foo_ind = i;
			bot = eval_simple(2, foo_ind, foo_ind, len);
			botok = true;
		}
	}
	
	ind += len + 1;
	return top / bot;
}

int eval_sqrt(int row) {
	ind += 2;
	int len = 0;
	for(int i = ind; i < cols; ++i) {
		if(grid[row-1][i] == '_') len++;
		else break;
	}
	//cout << 's' << ind << endl;
	int	foo_ind = ind;
	int res = eval_simple(row, foo_ind, foo_ind, len);

	ind += len + 1;
	//cout << 'f' << len << endl;
	return sqrt(res);
}

int eval_formule(int row) {
	char c = grid[row][ind];
	
	int cumul_res = 0;
	int mul_foo = 0;
	
	int res = 0;
	
	for(;;) {
		c = grid[row][ind];
	//	cout << ind << endl;
		if(isdigit(c)) {
			//cout << 'v' << ind << endl; 
			res = read_num(row, ind);
			//cout << ind << ' ' << res << endl;
			for(;;) {
				c = grid[row][ind];
				if(c == '*') {
					ind += 2;
					int num = read_num(row, ind);
					res *= num;		
				}
				else break;
			}
			//cout << 'l' << res << endl;
		}
		else if(c == '=') {
			res = eval_frac(row);
		}
		else if(c == '\\') {
		//cout << 'y' << ind << endl;
			res = eval_sqrt(row);
				//cout << 'y' << ind << endl;
		}
		

		
		
		if(mul_foo == 0)
			cumul_res = res;
		else 
			cumul_res += mul_foo * res;
		
		if(ind < cols) {
			c = grid[row][ind];
			if(c == '+') {
				ind += 2;
				//int num2 = eval_formule(row);
				//cout <<'x'<< num2 << endl;
				//res += num2;
				mul_foo = 1;
			}
			else if(c == '-') {
				ind += 2;
	//			int num2 = eval_formule(row);
				//cout << num2 << endl;
//				res -= num2;
				mul_foo = -1;
			}	
		}
		else break;
		
		//cout << 'z' << ind << endl;
	}
	
	//cout << 'i' << ind << endl;
	
	
	return cumul_res;

}

bool process() {

	cin >> rows >> cols;
	//cout << rows << cols << endl;
	if(rows == 0 && cols == 0) return false;
	cin.ignore();
	REP(i, rows) { 
		getline(cin, grid[i]);
		
	
		//cout << grid[i] << endl;
		if(grid[i].size() != cols)
			grid[i] += string(cols - grid[i].size(), ' ');	
		//cout << grid[i] << endl;
		//return false;
	}



	ind = 0;

	if(rows == 1)
	cout << eval_formule(0) << endl;
	else if(rows == 2) 
	cout << eval_formule(1) << endl;
	else
	cout << eval_formule(1) << endl;
//	cout << endl;
	return true;
}

int main() {
	
	while(process());

	return 0;
}