#include<stdio.h>
#include<algorithm>
using namespace std;
struct mat{
	int W;
	int H;
	int v[110][110];
	mat(){
		for(int i=0;i<110;i++)
			for(int j=0;j<110;j++)
				v[i][j]=0;
	}
};
int cur=0;
mat var[26];
char str[128];
mat expr();
mat term();
mat fact();
mat prim();
mat matrix();
mat row();
int mod=32768;
int DEBUG=0;
mat expr(){
	if(DEBUG)printf("expr in %d\n",cur);
	mat ret=term();
	while(str[cur]=='+'||str[cur]=='-'){
		if(str[cur]=='+'){
			cur++;
			mat ad=term();
			for(int i=0;i<ad.H;i++)
				for(int j=0;j<ad.W;j++)
					ret.v[i][j]=(ret.v[i][j]+ad.v[i][j])%mod;
		}else{
			cur++;
			mat ad=term();
			for(int i=0;i<ad.H;i++)
				for(int j=0;j<ad.W;j++)
					ret.v[i][j]=(ret.v[i][j]+mod-ad.v[i][j])%mod;
		}
	}
	if(DEBUG)printf("expr out %d\n",cur);
	return ret;
}
mat term(){
	if(DEBUG)printf("term in %d\n",cur);
	mat ret=fact();
	while(str[cur]=='*'){
		cur++;
		mat ad=fact();
		mat to;
		to.H=ret.H;
		to.W=ad.W;
		if(ret.H==1&&ret.W==1){
			to.H=ad.H;
			to.W=ad.W;
			for(int i=0;i<to.H;i++)
				for(int j=0;j<to.W;j++){
					to.v[i][j]=ret.v[0][0]*ad.v[i][j]%mod;
				}
		}else if(ad.H==1&&ad.W==1){
			to.H=ret.H;
			to.W=ret.W;
			for(int i=0;i<to.H;i++)
				for(int j=0;j<to.W;j++)
					to.v[i][j]=ad.v[0][0]*ret.v[i][j]%mod;
		}else{
			for(int i=0;i<to.H;i++){
				for(int j=0;j<to.W;j++){
					for(int k=0;k<ad.H;k++)
						to.v[i][j]=(to.v[i][j]+ret.v[i][k]*ad.v[k][j])%mod;
				}
			}
		}
		ret=to;
	}
	if(DEBUG)printf("term out %d\n",cur);
	return ret;
}
mat fact(){
	if(DEBUG)printf("fact in %d\n",cur);
	mat ret;
	if(str[cur]=='-'){
		cur++;
		ret=fact();
		for(int i=0;i<ret.H;i++)
			for(int j=0;j<ret.W;j++)
				ret.v[i][j]=(mod-ret.v[i][j])%mod;
		if(DEBUG)printf("fact out %d\n",cur);
		return ret;
	}else{
		ret=prim();
		if(DEBUG)printf("fact out %d\n",cur);
		return ret;
	}
}
mat prim(){
	if(DEBUG)printf("prim in %d\n",cur);
	mat r;
	if(str[cur]>='0'&&str[cur]<='9'){
		int ret=0;
		while(str[cur]>='0'&&str[cur]<='9'){
			ret=(ret*10+(str[cur]-'0'))%mod;
			cur++;
		}
		r.H=r.W=1;
		r.v[0][0]=ret;
	//	return r;
	}else if(str[cur]>='A'&&str[cur]<='Z'){
		r=var[str[cur]-'A'];
		cur++;
	}else if(str[cur]=='('){
		cur++;
		r=expr();
		cur++;
	}else{
		r=matrix();
	}
	//printf("%d %d\n",r.H,r.W);
	while(str[cur]=='('||str[cur]=='\''){
		if(str[cur]=='('){
			cur++;
			mat left=expr();
			cur++;
			mat right=expr();
			cur++;
			mat to;
			to.H=left.W;
			to.W=right.W;
			for(int i=0;i<to.H;i++){
				for(int j=0;j<to.W;j++){
					to.v[i][j]=r.v[left.v[0][i]-1][right.v[0][j]-1];
				}
			}
			r=to;
		}else{
			mat to;
			to.H=r.W;
			to.W=r.H;
			for(int i=0;i<to.H;i++){
				for(int j=0;j<to.W;j++){
					to.v[i][j]=r.v[j][i];
				}
			}
			r=to;
			cur++;
		}
	}
	//printf("%d %d\n",cur,r.v[0][0]);
	if(DEBUG)printf("prim out %d\n",cur);
	return r;
}
mat matrix(){
	if(DEBUG)printf("matrix in %d\n",cur);
	cur++;
	mat ret=row();
	while(str[cur]==';'){
		cur++;
		mat ad=row();
		for(int i=0;i<ad.H;i++){
			for(int j=0;j<ad.W;j++){
				ret.v[ret.H+i][j]=ad.v[i][j];
			}
		}
		ret.H+=ad.H;
	}
	cur++;
	if(DEBUG)printf("matrix out %d\n",cur);
	return ret;
}
mat row(){
	if(DEBUG)printf("row in %d\n",cur);
	mat ret=expr();
	while(str[cur]==' '){
		cur++;
		mat ad=expr();
		for(int i=0;i<ad.H;i++){
			for(int j=0;j<ad.W;j++){
				ret.v[i][j+ret.W]=ad.v[i][j];
			}
		}
		ret.W+=ad.W;
	}
	//printf("(%d, %d)\n",ret.H,ret.W);
	if(DEBUG)printf("row out %d\n",cur);
	return ret;
}
int main(){
	int a;
	while(scanf("%d",&a),a){
		gets(str);
		for(int i=0;i<a;i++){
			gets(str);
			int to=str[0]-'A';
			cur=2;
			var[to]=expr();
			for(int j=0;j<var[to].H;j++){
				for(int k=0;k<var[to].W;k++){
					if(k)printf(" ");
					printf("%d",var[to].v[j][k]);
				}
				printf("\n");
			}
		}
		printf("-----\n");
	}
}

Measured memory_bytes: 3400