#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>

using namespace std;

typedef vector<int> vec;
typedef vector<vector<int> > mat;

int n;
mat vars[200];
const int mod=1<<15;

mat Primary(string);
mat Expr(string);

void PrintMat(mat &m){
  for(int i=0;i<m.size();i++){
    for(int j=0;j<m[i].size();j++){
      cout<<m[i][j];
      if(j==m[i].size()-1)cout<<endl;
      else cout<<" ";
    }
  }
}
bool isDig(const string &s){
  for(int i=0;i<s.size();i++)
    if(!(s[i]>='0'&&s[i]<='9'))return false;
  return true;
}
mat Add(const mat &a,const mat &b){
  mat c(a.size(),vec(a[0].size()));
  for(int i=0;i<a.size();i++)
    for(int j=0;j<a[i].size();j++)
      c[i][j]=(a[i][j]+b[i][j]+mod)%mod;
  return c;
}
mat Sub(const mat &a,const mat &b){
  mat c(a.size(),vec(a[0].size()));
  for(int i=0;i<a.size();i++)
    for(int j=0;j<a[i].size();j++)
      c[i][j]=(a[i][j]-b[i][j]+mod)%mod;
  return c;
}
mat Mul(const mat &a,const mat &b){
  // 定数倍
  if(a.size()==1&&a[0].size()==1){
    mat c=b;
    for(int i=0;i<c.size();i++)
      for(int j=0;j<c[0].size();j++)
	c[i][j]=(c[i][j]*a[0][0])%mod;
    return c;
  }
  else if(b.size()==1&&b[0].size()==1){
    mat c=a;
    for(int i=0;i<c.size();i++)
      for(int j=0;j<c[0].size();j++)
	c[i][j]=(c[i][j]*b[0][0])%mod;
    return c;
  }
  else{
    mat c(a.size(),vec(b[0].size()));
    for(int i=0;i<a.size();i++){
      for(int j=0;j<b[0].size();j++){
	int sum=0;
	for(int k=0;k<a[i].size();k++)
	  sum=(sum+a[i][k]*b[k][j])%mod;
	c[i][j]=sum;
      }
    }
    return c;
  }
  return mat();
}

bool isSurroundedSquareBracket(string s){
  if(s[0]!='[')return false;
  int cnt=1;
  for(int i=1;i<s.size()-1;i++){
    if(s[i]=='[')cnt++;
    else if(s[i]==']')cnt--;
    if(cnt==0)return false;
  }
  return (cnt==1);
}
bool isSurroundedParenthese(string s){
  if(s[0]!='(')return false;
  int cnt=1;
  for(int i=1;i<s.size()-1;i++){
    if(s[i]=='(')cnt++;
    else if(s[i]==')')cnt--;
    if(cnt==0)return false;
  }
  return (cnt==1);
}
mat ConnectMatrixWithVertival(mat a,mat b){
  int h=a.size()+b.size();
  int w=a[0].size();
  mat res(h,vec(w));
  for(int i=0;i<a.size();i++)
    for(int j=0;j<w;j++)
      res[i][j]=a[i][j];
  for(int i=0;i<b.size();i++)
    for(int j=0;j<w;j++)
      res[i+a.size()][j]=b[i][j];
  return res;
}
mat ConnectMatrixWithHorizonal(mat a,mat b){
  int h=a.size();
  int w=a[0].size()+b[0].size();
  mat res(h,vec(w));
  for(int i=0;i<h;i++)
    for(int j=0;j<a[0].size();j++)
      res[i][j]=a[i][j];
  for(int i=0;i<h;i++)
    for(int j=0;j<b[0].size();j++)
      res[i][j+a[0].size()]=b[i][j];
  return res;
}
mat Row(string s){
  int cnt=0;
  for(int i=0;i<s.size();i++){
    if(s[i]=='('||s[i]=='[')cnt++;
    else if(s[i]==')'||s[i]==']')cnt--;
    else if(cnt==0&&s[i]==' '){
      //cout<<s.substr(0,i)<<endl;
      //cout<<s.substr(i+1)<<endl;
      //mat m1=Expr(s.substr(0,i));
      //mat m2=Row(s.substr(i+1));
      // cout<<"ooooo"<<endl;
      // cout<<s.substr(0,i)<<endl;
      // PrintMat(m1);
      // cout<<":::"<<endl;
      // cout<<s.substr(1+i)<<endl;
      // PrintMat(m2);
      // cout<<"ooooo"<<endl;
      return ConnectMatrixWithHorizonal
	(Expr(s.substr(0,i)),Row(s.substr(i+1)));
    }
  }
  return Expr(s);
}
mat RowSeq(string s){
  int cnt=0;
  //cout<<s<<endl;
  for(int i=0;i<s.size();i++){
    if(s[i]=='('||s[i]=='[')cnt++;
    else if(s[i]==')'||s[i]==']')cnt--;
    else if(cnt==0&&s[i]==';'){
      //cout<<s.substr(0,i)<<endl;
      //cout<<s.substr(i+1)<<endl;
      //mat m1=Row(s.substr(0,i));
      //mat m2=RowSeq(s.substr(i+1));
      // cout<<"--"<<endl;
      // PrintMat(m1);
      // cout<<"***"<<endl;
      // PrintMat(m2);
      // cout<<"--"<<endl;
      return ConnectMatrixWithVertival
	(Row(s.substr(0,i)),RowSeq(s.substr(i+1)));
    }
  }
  return Row(s);
}
mat Matrix(string s){
  return RowSeq(s.substr(1,s.size()-2));
}
mat IndexedPrimary(string s){
  //cout<<s<<endl;
  int cnt=1;
  for(int i=s.size()-2;i>=0;i--){
    if(s[i]==')')cnt++;
    else if(s[i]=='(')cnt--;
    if(cnt==0){
      // cout<<s.substr(0,i)<<endl;
      // cout<<flush;
      mat source=Primary(s.substr(0,i));
      // 括弧を排除
      s=(s.substr(i+1));
      s=s.substr(0,s.size()-1);
      // cout<<s<<endl;
      cnt=0;
      for(int j=0;j<s.size();j++){
	if(s[j]=='(')cnt++;
	else if(s[j]==')')cnt--;
	if(cnt==0&&s[j]==','){
	  mat a=Expr(s.substr(0,j));
	  mat b=Expr(s.substr(j+1));
	  // calc
	  mat res(a[0].size(),vec(b[0].size()));
	  for(int i=0;i<a[0].size();i++)
	    for(int j=0;j<b[0].size();j++)
	      res[i][j]=source[a[0][i]-1][b[0][j]-1];
	  return res;
	}
      }
    }
  }
}
mat Transpose(mat m){
  mat res(m[0].size(),vec(m.size()));
  for(int i=0;i<m.size();i++)
    for(int j=0;j<m[0].size();j++)
      res[j][i]=m[i][j];
  return res;
}
mat TransposedPrimary(string s){
  return Transpose(Primary(s.substr(0,s.size()-1)));
}
mat Primary(string s){
  if(isDig(s)){
    mat m(1,vec(1));
    m[0][0]=atoi(s.c_str());
    return m;
  }
  if(s.size()==1&&s[0]>='A'&&s[0]<='Z')
    return vars[s[0]];
  // 行列なら行列を作成
  if(isSurroundedSquareBracket(s))return Matrix(s);
  // 丸括弧
  if(isSurroundedParenthese(s))
    return Expr(s.substr(1,s.size()-2));
  // 転置
  if(s[s.size()-1]=='\'')
    return TransposedPrimary(s);
  return IndexedPrimary(s);
}
mat Negative(mat m){
  for(int i=0;i<m.size();i++)
    for(int j=0;j<m[0].size();j++)
      m[i][j]=(-m[i][j]+mod)%mod;
  return m;
}
mat Factor(string s){
  if(s[0]=='-')return Negative(Factor(s.substr(1)));
  return Primary(s);
}
mat Term(string s){
  int maru=0;int kado=0;
  for(int i=s.size()-1;i>=0;i--){
    if(s[i]==')')maru++;
    else if(s[i]=='(')maru--;
    else if(s[i]==']')kado++;
    else if(s[i]=='[')kado--;
    else if(!(maru|kado)&&s[i]=='*'){
      //cout<<s.substr(0,i)<<endl;
      //mat m=Term(s.substr(0,i));
      //cout<<s.substr(1+i)<<endl;
      return Mul(Term(s.substr(0,i)),
		 Factor(s.substr(i+1)));
    }
  }
  return Factor(s);
}
mat Expr(string s){
  // cout<<s<<endl;
  // cout<<flush;
  // digit
  if(isDig(s)){
    mat m(1,vec(1));
    m[0][0]=atoi(s.c_str());
    return m;
  }
  int maru=0;
  int kado=0;
  for(int i=s.size()-1;i>=1;i--){
    if(s[i]==')')maru++;
    else if(s[i]=='(')maru--;
    else if(s[i]==']')kado++;
    else if(s[i]=='[')kado--;
    else if(!(maru|kado)&&s[i]=='+'){
      // cout<<s.substr(0,i)<<endl;
      // mat m=Expr(s.substr(0,i));
      // PrintMat(m);
      
      // cout<<flush;
      
      // cout<<s.substr(1+i)<<endl;
      return Add(Expr(s.substr(0,i)),
		 Term(s.substr(i+1)));
    }
    else if(!(maru|kado)&&s[i]=='-'){
      // 連続する-記号の一番左まで移動
      while(i>0&&s[i-1]=='-')i--;
      if(i==0)continue;
      if(s[i-1]=='*'||s[i-1]=='+')continue;
      return Sub(Expr(s.substr(0,i)),
		 Term(s.substr(i+1)));
    }
  }
  //maru=kado=0;
  // for(int i=s.size()-1;i>=1;i--){
  //   if(s[i]==')')maru++;
  //   else if(s[i]=='(')maru--;
  //   else if(s[i]==']')kado++;
  //   else if(s[i]=='[')kado--;
  //   else if(!(maru|kado)&&s[i]=='-'){
  //     // 連続する-記号の一番左まで移動
  //     while(i>0&&s[i-1]=='-')i--;
  //     if(i==0)continue;
  //     if(s[i-1]=='*')continue;
  //     return Sub(Expr(s.substr(0,i)),
  // 		 Term(s.substr(i+1)));
  //   }
  return Term(s);
}

int main(){
  while(cin>>n&&n){
    string s;
    getline(cin,s);
    for(int i=0;i<n;i++){
      getline(cin,s);
      char var=s[0];
      s=s.substr(2,s.size()-3);
      mat res=Expr(s);
      vars[var]=res;
      PrintMat(res);
    }
    cout<<"-----"<<endl;
  }
  return 0;
}

Measured memory_bytes: 1256