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

Measured memory_bytes: 4052