#include <bits/stdc++.h>
#define rep(i,n) for(int i=1;i<=n;++i)
#define N 1005
using namespace std;
int a[N][N],b[N],p[N],n,tp;
void add(int x,int y,int z){
	printf("%d %d %d\n",x,y,z);
}
int cmp(int x,int y){return p[x]<p[y];}
bool build(int x,int l,int r){
	//printf("Case:%d %d %d\n",x,l,r);
	for(int i=l+1;i<=r;++i){
		tp=a[x][b[i]]-a[b[l]][b[i]]+a[x][b[l]];
		if(tp&1)return 0;
		tp>>=1;
		if(tp<0||tp>a[x][b[l]])return 0;
		p[b[i]]=tp;
	}
	sort(b+l+1,b+r+1,cmp);p[b[l]]=0;p[b[r+1]]=-1;
	int st=0,hd=x,la=0;
	for(int i=l+1;i<=r;){
		st=i;
		if(p[b[st]]==a[x][b[l]]){add(hd,b[l],p[b[st]]-la);la=p[b[st]];hd=b[l];}
		else if(p[b[st]]!=0){++n;add(hd,n,p[b[st]]-la);la=p[b[st]];hd=n;}
		//printf("%d\n",hd);
		do{
			tp=a[x][b[i]]-p[b[i]];
			if(tp<0)return 0;
			a[hd][b[i]]=a[b[i]][hd]=tp;
		}while(++i,p[b[i]]==p[b[i-1]]);
		if(!build(hd,st,i-1))return 0;
	}
	//printf("%d %d\n",p[b[r]]);
	//printf("%d\n",la);
	if(hd!=b[l])add(hd,b[l],a[x][b[l]]-la);
	return 1;
}
int main(){
	freopen("D.in","r",stdin);
	scanf("%d",&n);rep(i,n)b[i]=i;
	rep(i,n-1)rep(j,n-i)scanf("%d",&a[i][i+j]),a[i+j][i]=a[i][i+j];
	if(!build(n,1,n-1)){puts("impossible");return 0;}
	
	return 0;
}