#include<stdio.h>
#include<algorithm>
using namespace std;
char in[1100];
int cur;
int mod=32768;
struct mat{
	int h,w;
	int v[110][110];
	mat(){
		h=w=0;
		for(int i=0;i<110;i++)for(int j=0;j<110;j++)v[i][j]=0;
	}
};
mat var[26];
mat expr();
int num(){
	int ret=0;
	while('0'<=in[cur]&&in[cur]<='9'){
		ret=(ret*10+in[cur]-'0')%mod;
		cur++;
	}
	return ret;
}
mat row(){
	
	mat ret=expr();
	//printf("in %d %d %d\n",ret.h,ret.w,ret.v[0][0]);
	//fflush(stdout);
	while(in[cur]==' '){
		cur++;
		mat tmp=expr();
		for(int i=0;i<ret.h;i++)for(int j=0;j<tmp.w;j++){
			ret.v[i][ret.w+j]=tmp.v[i][j];
		}
		ret.w+=tmp.w;
	}
	//printf("out %d %d\n",ret.h,ret.w);
	return ret;
}
mat matr(){
	//printf("%d\n",cur);
	mat ret=row();
	//printf("%d %d\n",ret.h,ret.w);fflush(stdout);
	while(in[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;
	}
	return ret;
}
mat prim(){
	//printf("prim %d\n",cur);fflush(stdout);
	mat ret;
	if('0'<=in[cur]&&in[cur]<='9'){
		int tmp=num();
		ret.w=ret.h=1;
		ret.v[0][0]=tmp;
	}else if(in[cur]=='('){
		cur++;
		ret=expr();
		cur++;
	}else if(in[cur]=='['){
		cur++;
		ret=matr();
		cur++;
	}else{
		ret=var[in[cur]-'A'];
		cur++;
	}
	while(in[cur]=='('||in[cur]=='\''){
		if(in[cur]=='('){
			cur++;
			mat left=expr();
			cur++;
			mat right=expr();
			cur++;
			mat tmp;
			tmp.h=left.w;
			tmp.w=right.w;
			for(int i=0;i<tmp.h;i++)for(int j=0;j<tmp.w;j++){
				tmp.v[i][j]=ret.v[left.v[0][i]-1][right.v[0][j]-1];
			}
			ret=tmp;
		}else{
			cur++;
			mat tmp;
			tmp.h=ret.w;
			tmp.w=ret.h;
			for(int i=0;i<ret.w;i++)for(int j=0;j<ret.h;j++){
				tmp.v[i][j]=ret.v[j][i];
			}
			ret=tmp;
		}
	}
	//printf("%d %d: %d\n",ret.h,ret.w,ret.v[0][0]);
	return ret;
}
mat fact(){
	//printf("fact %d %c\n",cur,in[cur]);fflush(stdout);
	if(in[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;
		}
		return tmp;
	}else{
		//printf("go %d\n",cur);
		mat ret=prim();
		return ret;
	}
}
mat term(){
//	printf("term %d\n",cur);fflush(stdout);
	mat ret=fact();
	while(in[cur]=='*'){
		cur++;
		mat tmp=fact();
		if(ret.h==1&&ret.w==1){
			mat to;
			to.h=tmp.h;to.w=tmp.w;
			for(int i=0;i<tmp.h;i++)for(int j=0;j<tmp.w;j++){
				to.v[i][j]=(ret.v[0][0]*tmp.v[i][j])%mod;
			}
			ret=to;
		}else if(tmp.h==1&&tmp.w==1){
			mat to;
			to.h=ret.h;to.w=ret.w;
			for(int i=0;i<ret.h;i++)for(int j=0;j<ret.w;j++){
				to.v[i][j]=(ret.v[i][j]*tmp.v[0][0])%mod;
			}
			ret=to;
		}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;
		}
	}
	return ret;
}
mat expr(){
	//printf("expr %d\n",cur);fflush(stdout);
	mat ret=term();
	while(in[cur]=='+'||in[cur]=='-'){
		char com=in[cur++];
		mat tmp=term();
		for(int i=0;i<ret.h;i++)for(int j=0;j<ret.w;j++){
			if(com=='+')ret.v[i][j]=(tmp.v[i][j]+ret.v[i][j])%mod;
			else ret.v[i][j]=(ret.v[i][j]-tmp.v[i][j]+mod)%mod;
		}
	}
	//printf("%d %d\n",ret.h,ret.w);
	return ret;
}
int main(){
	int a;
	while(scanf("%d",&a),a){
		gets(in);
		for(int i=0;i<a;i++){
			gets(in);
			cur=2;
			mat ret=expr();
			var[in[0]-'A']=ret;
			for(int j=0;j<ret.h;j++){
				for(int k=0;k<ret.w;k++){
					if(k)printf(" ");
					printf("%d",ret.v[j][k]);
				}
				printf("\n");
			}
		}
		printf("-----\n");
	}
}

Measured memory_bytes: 4008