#include <stdio.h>
#define MAXDICE 5
#define MAXSIDES 20
#define MAXMAX 201

/* A program I actually wrote to solve a puzzle.  It is not deliberately 
 obfuscated.  Can you figure out what puzzle it solves without 
 running it?  */
/* Or even with running it? */

int d[MAXDICE][MAXSIDES]; int preal[MAXMAX]; int p[MAXMAX];
int sides; int dice; int max;

void copyp (void) { int lcv; for (lcv=0;lcv<max;lcv++) preal[lcv]=p[lcv]; }
void printout (int die[]) { int lcv; for (lcv=0;lcv<sides;lcv++) 
  if (die[lcv]==max) printf("X "); else printf("%d ",die[lcv]); 
  printf("\n");}
int printall (void) { int lcv; 
  for (lcv=0;lcv<dice;lcv++) printout(d[lcv]); printf("\n"); return 0;}
void rst (int px[]) { int lcv; for (lcv=0;lcv<max;lcv++) px[lcv]=0; }
void rstd (int die[]) { int lcv; die[0]=1;
  for (lcv=1;lcv<sides;lcv++) die[lcv]=max; }
void rstad (void) { int lcv; for (lcv=0;lcv<dice;lcv++) rstd(d[lcv]); }
void rcalc (int iter, int sum) { int lcv; int ans; if (sum>max) sum=max;
  if (iter!=dice) for (lcv=0;lcv<sides;lcv++) { rcalc(iter+1,sum+d[iter][lcv]);
  } else if (sum<max) { (p[sum])++; } }
int equal (void) { int lcv; int ans=1; for (lcv=0;lcv<max;lcv++) 
  if (preal[lcv]!=p[lcv]) ans=0; return ans; }
int filled (void) { int lcv1; int lcv2; int ans=1;
  for (lcv1=0;lcv1<dice;lcv1++) for (lcv2=0;lcv2<sides;lcv2++)
    if (d[lcv1][lcv2]==max) ans=0; return ans; }
int diff (int die1[], int die2[]) { int lcv; int ans=0;
  for (lcv=0;lcv<sides;lcv++) if (die1[lcv]!=die2[lcv]) ans=1; return ans; }
int opening (int die[]) { int lcv; int ans=0; for (lcv=sides-1;lcv>=0;lcv--) 
  if (die[lcv]==max) ans=lcv; return ans; }

void assign (int needed, int value, int avail) {
  int opn;
  if (avail!=dice) {
    if (needed==0) {
      rst(p);
      rcalc(0,0);
      if (filled()) 
        equal() && printall();
      else {
        opn = (preal[value+dice] - p[value+dice]);
        if (opn>=0) assign(opn,value+1,0);
      }
    } else {
      opn=opening(d[avail]);
      if (opn) {
        if ((avail==0) || diff(d[avail-1],d[avail])) {
          d[avail][opn]=value;
          assign(needed-1,value,avail);
          d[avail][opn]=max;
        }
        assign(needed,value,avail+1);
      } else assign(needed,value,avail+1);
    }
  }
}
  
void main (void) {

  int lcv,lcv2,tmax;
  scanf("%d",&sides);
  while (sides) {
    printf("\n");
    scanf("%d\n",&dice);
    max = 0;
    for (lcv=0;lcv<dice;lcv++) {
      tmax=0;
      for (lcv2=0;lcv2<sides;lcv2++) {
        scanf("%d",&d[lcv][lcv2]);
        if (d[lcv][lcv2]>tmax) tmax=d[lcv][lcv2];
      }
      max += tmax;
      scanf("\n");
    }
    rst(p);
    rcalc(0,0);
    copyp();
    rstad();
    assign(0,1,0);
    scanf("%d",&sides);
  } 
}


