#include <stdio.h>
#include <sstream>
#include <set>
#include <queue>
#include <vector>
#include <iostream>
#include <math.h>
#define pb push_back
#define REP(i, n) for(int (i)=0;(i)<(n);(i)++)
using namespace std;
#include <map>
#include <algorithm>
#define mp make_pair
#include <string.h>
string s;
char lna[3][3333];
string line[3];

struct token {
	int type; // 0=integer, 1=sqrt, 2=fraction, 3=op
	int hodnota;
	vector<token> citatel;
	vector<token> jmenovatel;
	vector<token> obsah;
	token(int t, int h, vector<token> x, vector<token> y, vector<token> z) {
		type = t; hodnota = h; citatel = x; jmenovatel = y; obsah = z;
	}
};
vector<token> prazdny;

vector<token> tokenizesimple(string s) {
	vector<token> res;
	for(int i = 0; i < s.size(); ) {
		if(s[i] >= '0' && s[i] <= '9') {
			int cnum = 0;
			while(s[i] >= '0' && s[i] <= '9') {
				cnum *= 10;
				cnum += s[i]-'0';
				i++;
			}
			res.pb(token(0, cnum, prazdny, prazdny, prazdny));
			i++;
		} else if(s[i] == '+' || s[i] == '-' || s[i] == '*') {
			res.pb(token(3, s[i], prazdny, prazdny, prazdny));
			i++;
		} else i++;
	}
	return res;
}
int vyhodnotjednoduchy(vector<token> V) {
	for(int i = 0; i < V.size(); i++) {
		if(V[i].type == 3 && V[i].hodnota == '*') {
			V[i-1] = token(0, V[i-1].hodnota*V[i+1].hodnota, prazdny, prazdny, prazdny);
			V.erase(V.begin()+i);
			V.erase(V.begin()+i);
			i--;
		}
	}
	for(int i = 0; i < V.size(); i++) {
		if(V[i].type == 3 && V[i].hodnota == '+') {
			V[i-1] = token(0, V[i-1].hodnota+V[i+1].hodnota, prazdny, prazdny, prazdny);
			V.erase(V.begin()+i);
			V.erase(V.begin()+i);
			i--;
		}
	}
	for(int i = 0; i < V.size(); i++) {
		if(V[i].type == 3 && V[i].hodnota == '-') {
			V[i-1] = token(0, V[i-1].hodnota-V[i+1].hodnota, prazdny, prazdny, prazdny);
			V.erase(V.begin()+i);
			V.erase(V.begin()+i);
			i--;
		}
	}
	return V[0].hodnota;
}

int vyhodnot(vector<token> V) {
	for(int i = 0; i < V.size(); i++) {
		
		if(V[i].type == 1) {
			V[i] = token(0, sqrt(vyhodnotjednoduchy(V[i].obsah)), prazdny, prazdny, prazdny);
		} else if(V[i].type == 2) {
			V[i] = token(0, vyhodnotjednoduchy(V[i].citatel)/vyhodnotjednoduchy(V[i].jmenovatel), prazdny, prazdny, prazdny);
		}
	}
	return vyhodnotjednoduchy(V);
}
int main() {
	int R, C;
	while(scanf("%d%d", &R, &C) == 2) {
		if(R == 0)
			break;
		char x;
		scanf("%c", &x);
		REP(i, R) {
			getline(cin, line[i]);
		}
		vector<token> baseline;
		int bL = 1;
		if(R == 1) bL = 0;
		for(int i = 0; i < line[bL].size(); ) {
			if(line[bL][i] >= '0' && line[bL][i] <= '9') {
				int cnum = 0;
				while(line[bL][i] >= '0' && line[bL][i] <= '9') {
					cnum *= 10;
					cnum += line[bL][i]-'0';
					i++;
				}
				baseline.pb(token(0, cnum, prazdny, prazdny, prazdny));
				i++;
			} else if(line[bL][i] == '+' || line[bL][i] == '-' || line[bL][i] == '*') {
				baseline.pb(token(3, line[bL][i], prazdny, prazdny, prazdny));
				i++;
			} else if(line[bL][i] == '\\') {
				i++;
				i++;
				stringstream ss;
				while(line[bL-1][i] == '-') {
					ss << line[bL][i];
					i++;
				}
				baseline.pb(token(1, 0, prazdny, prazdny, tokenizesimple(ss.str())));
				i++;
			} else if(line[bL][i] == '=') {
				stringstream cita, jmen;
				while(line[bL][i] == '=') {
					cita << line[bL-1][i];
					jmen << line[bL+1][i];
					i++;
				}
				baseline.pb(token(2, 0, tokenizesimple(cita.str()), tokenizesimple(jmen.str()), prazdny));
				i++;
			} else {
				i++;
			}
		}
		printf("%d\n", vyhodnot(baseline));
	}
	return 0;
}