#include <stdio.h>
#include <assert.h>

#define MAX 100
#define DAT 3
#define ANO 2
#define MES 1
#define DIA 0



#define MAX 100

void LeMatriz( int Mat[MAX][DAT], int  n ) {
  int i,j;
  for ( i = 0; i < n; i++)
    for ( j = 0; j < 3; j++)
      scanf("%d", &Mat[i][j]);
  return;
}

void ImprimeMatriz( int Mat[MAX][DAT], int n ) {
  int i,j;
  for ( i = 0; i < n; i++) {
    for ( j = 0; j < DAT; j++)
      printf( "%5d ", Mat[i][j] );
    printf( "\n" );
  }
  return;
}

int  IndiceDoMenor( int M[][DAT], int i, int n );
void Troca( int M[][DAT], int i, int j );


int main()
{
  int M[MAX][DAT];
  int n;
  int i, imenor;

  scanf( "%d", &n );
  assert( n <= MAX );

  LeMatriz( M, n );   

  for (i = 0; i < n; i++) {
    imenor = IndiceDoMenor( M, i, n);
    Troca( M, i, imenor );
  }

  ImprimeMatriz( M, n );

  return 0;
}


void LeSequenciaDeDatas( int M[][DAT], int n ) {
  int i;
  for ( i = 0; i < n; i++)
    scanf("%d %d %d", &M[i][0], &M[i][1], &M[i][2]);
  return;
}

/* void ImprimeSequencia( int M[][DAT], int n ) { */
/*   int i; */
/*   for ( i = 0; i < n; i++) */
/*     printf( "%7.3f ", S[i] ); */
/*   printf( "\n" ); */
/*   return; */
/* } */

int ComparaDatas( int D1[], int D2[] ) {
  if (D1[ANO] < D2[ANO]) return -1;
  else if (D1[ANO] > D2[ANO]) return +1;
  if (D1[MES] < D2[MES]) return -1;
  else if (D1[MES] > D2[MES]) return +1;
  if (D1[DIA] < D2[DIA]) return -1;
  else if (D1[DIA] > D2[DIA]) return +1;
  return 0;
}
  

/* devolve indice do menor elto no intervalo de i a n-1 */
int IndiceDoMenor( int M[][DAT], int i, int n ) {
  int j, m;
  m = i;
  /* m eh o indice do menor elemento de S[i..j-1] */
  for ( j = i+1; j < n; j++ )
    if ( ComparaDatas( M[j], M[m] ) == -1 )
      m = j;
  return m;
}

void Troca( int M[][DAT], int i, int j ) {
  int aux;
  int k;
  for ( k = 0; k < DAT; k++ ) {
    aux = M[i][k];
    M[i][k] = M[j][k];
    M[j][k] = aux;
  }
  return;
}