#include<iostream>
#include<algorithm>
#include<vector>
#include<cstdlib>
using namespace std;
#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)
#define ALL(C) (C).begin(),(C).end()
#define pb push_back

const int N = 401;
int len[N];
vector<vector<int> > path;

bool chlen(int val,int now,int *in,bool flag){
  bool ret=true;
  rep(i,now){
    int tmp=abs(val-in[i]);
    if(flag)len[tmp]++;
    else len[tmp]--;
    if (!flag&&len[tmp] < 0)ret=false;
  }

  if (!ret){
    rep(i,now){
      len[abs(val-in[i])]++;
    }
  }
  return ret;
}

bool canput(int val,int now,int *in){
  return chlen(val,now,in,false);
}

int buf[20];
const int sign[2]={1,-1};
void search(int n,int now,int *pos,int p){
  if (n == now){
    vector<int> tmp;
    rep(i,n)buf[i]=pos[i];
    sort(buf,buf+n);
    rep(i,n-1){
      tmp.pb(buf[i+1]-buf[i]);
    }
    path.pb(tmp);
    return ;
  }
  //rep(i,now)cout << pos[i] <<" ";cout << endl;
  
  while(p>0 && len[p]==0)p--;
  rep(k,2){
    rep(i,now){
      bool isok=true;
      int val=pos[i]+sign[k]*p;
      if (val > pos[1] || val <0)continue;
      rep(j,now){
	if (i!=j && pos[j] ==val){isok=false;break;}
	//if(pos[i] < pos[j] < val continue;for prune
      }
      //cout << pos[i]<<" " << sign[k]*p << " " << val <<" " << isok << endl;

      if (!isok)continue;
      if (canput(val,now,pos)){
	pos[now]=val;
	search(n,now+1,pos,p);
	chlen(val,now,pos,true);
      }
    }
  }
}

int main(){
  int n;
  int pos[20];
  while(cin>>n && n){
    rep(i,N)len[i]=0;
    path.clear();
    int maxi=0;
    rep(i,n){
      REP(j,i+1,n){
	int tmp;cin>>tmp;len[tmp]++;maxi=max(maxi,tmp);
      }
    }
    pos[0]=0;
    pos[1]=maxi;
    len[maxi]--;

    search(n,2,pos,maxi);
    sort(ALL(path));
    //cout <<"before "<< path.size() << endl;
    path.erase(unique(ALL(path)),path.end());
    //cout <<"after "<< path.size() << endl;
    rep(i,path.size()){
      rep(j,path[i].size()){
	if (j)cout << " ";
	cout << path[i][j];
      }
      cout << endl;
    }
    cout << "-----"<<endl;
  }
  return false;
}




/*
void solve(int n,int now,int *pos){
  if (n-1 == now){
    vector<int> tmp;
    rep(i,n-1){
      //if (i)cout <<' ';
      //cout << op[i+1]-op[i];
      tmp.pb(pos[i+1]-pos[i]);
    }
    path.pb(tmp);
    //    cout << endl;
    //rep(i,n)cout << op[i] <<" ";cout << endl;
    return ;
  }

  //rep(i,now)cout << pos[i] <<" ";cout << pos[n-1] << endl;

  for(int i=pos[n-1]-1;i>=1;i--){
    if (len[i] == 0)continue;
    //cout << "exist "<< i <<":"<<len[i] <<endl;
    if (pos[now-1] +i < pos[n-1] && canput(pos[now-1]+i,n,now,pos)){
	pos[now]=pos[now-1]+i;
	//chlen(pos[now],n,now,pos,false);
	solve(n,now+1,pos);
	chlen(pos[now],n,now,pos,true);
    }
  }
}
*/