#include <stdio.h>
#include <math.h>
#include <stddef.h>
#include <stdlib.h>
#include <ctype.h>

main()
{
int nsam, i, i2, j, k, jstart, jend, *vector ;
int nval;
char **gamnam, s[3000];
FILE *pf ;
double **dij,**rank, **vector2 ;
	
	pf = stdin; 
	fgets(s,3000,pf);
	fputs(s,stdout);
	sscanf(s,"%*s%*s%*s%d",&nsam);
	
	if( (dij = (double **)malloc((size_t)nsam*sizeof( double * ) ) ) == NULL)
		perror( "malloc error2\n") ;
	for(i=0;i<nsam;i++){
		if( (dij[i] = (double *)malloc( (size_t)nsam*sizeof(double))) == NULL)
			perror( "malloc error3\n") ;
	   }
	if( (rank = (double **)malloc((size_t)nsam*sizeof( double * ) )) == NULL)
			perror( "malloc error4a\n") ;
 	for(i=0;i<nsam;i++){
 		if( (rank[i] = (double *)malloc( (size_t)nsam*sizeof(double))) == NULL)
			perror( "malloc error5a\n") ;
 	    }
	if( (gamnam = (char **)malloc((size_t)nsam*sizeof( char * ) ) ) == NULL)
		perror( "malloc error4\n") ;
	for(i=0;i<nsam;i++){
		if( (gamnam[i] = (char *)malloc( (size_t)35*sizeof(char))) == NULL)
			perror( "malloc error5\n") ;
	   }
 	nval = (nsam*(nsam-1))/2 ;
 	if( (vector = ( int *)malloc( (size_t)nval*sizeof(int) )) == NULL)
			perror( "malloc error6\n") ;
	if( (vector2 = ( double **)malloc( (size_t)nval*sizeof(double *) )) == NULL)
			perror( "malloc error7\n") ;

        i = 0 ;
        jend = -1 ;
        while( i< nsam-1 ){
          jstart = jend +1  ;
          while(1){
                fgets(s,3000, pf);
                if( s[0]=='O' && s[1]=='T' && s[2]=='U'&&s[3]=='s' ) {
                        jend = countwords(s) + jstart -2 ;
                        if( i==0) {
				 jstart++ ;
				fprintf(stdout,"OTUs ");
				for( i2 = 0; i2 <nsam ; i2++) fprintf(stdout," %d",i2);
				fprintf(stdout,"\n");
				}
                        break;
                        }
		else if( i == 0 ) fputs(s,stdout);
                }
        for( i=0; i<jend; i++){
                fscanf(pf," %s",gamnam[i]);
		dij[i][i] = 0.0 ;
                if( jstart < i+1) jstart = i+1 ;
                for( j=jstart; j<= jend; j++) {
                        fscanf(pf," %lf", dij[i]+j  );
			dij[j][i] = dij[i][j] ;
                         }
              }
        }

	
	
	for(i=k=0;i<(nsam-1);i++)
		for(j=i+1;j<nsam;j++){
			vector[k] = dij[i][j];
			vector2[k++] = &rank[i][j] ;
			}
	sort2(nval,vector-1,vector2-1);
	i=0;
	while( i<nval ) {     /* take care of ties */
		j=1;
		while( (vector[i+j] == vector[i]) && (i+j)<nval ) j++;
		for(k=0;k<j;k++) *vector2[i+k] = i + (j-1)/2. ;
		i += j;
		}
	for(i=0;i<(nsam-1);i++)
		for(j=i+1;j<nsam;j++) rank[j][i]=rank[i][j];
	for( i=0; i<nsam-1; i++){
		fprintf(stdout,"%d\t",i);
		for( j=0; j<=i; j++) fprintf(stdout,"\t");
		for( j=i+1; j<nsam; j++) fprintf(stdout,"%g\t",rank[i][j] );
		fprintf(stdout,"\n");
		}		
	
}

int sort2(n,ra,rb)  /* a sort routine from Numerical Recipes by Press, et al */
	int n;
	int ra[];
	 double *rb[];
{
	int l,j,ir,i;
	int rra;
	double *rrb;

	l=(n >> 1)+1;
	ir=n;
	for (;;) {
		if (l > 1) {
			rra=ra[--l];
			rrb=rb[l];
		} else {
			rra=ra[ir];
			rrb=rb[ir];
			ra[ir]=ra[1];
			rb[ir]=rb[1];
			if (--ir == 1) {
				ra[1]=rra;
				rb[1]=rrb;
				return;
			}
		}
		i=l;
		j=l << 1;
		while (j <= ir)	{
			if (j < ir && ra[j] < ra[j+1]) ++j;
			if (rra < ra[j]) {
				ra[i]=ra[j];
				rb[i]=rb[j];
				j += (i=j);
			}
			else j=ir+1;
		}
		ra[i]=rra;
		rb[i]=rrb;
	}
}



	int
countwords(s)
	char *s;
{
	int wc, cc=0, out = 1, in=0 , state, c ;
	
	wc = 0 ;
	state = out;
	while( s[cc] != '\n' ){
		c = s[cc] ;
		if( isspace( c) ) state = out ;
		else if( state == out) {
			state = in ;
			wc++;
			}
		cc++;
		}
		return( wc) ;
}



