#include <stdio.h>
#include <iostream.h>
#define DISP 10

long tots,tots2;
int sm[28];  // small val
int bg[28];  // big val
int x1[28]; int x2[28]; int y1[28]; int y2[28];
int board[8][8];
int xsum[8]; int ysum[8]; int d1sum; int d2sum;
int xcount[8]; int ycount[8]; int d1count; int d2count;
int dlist[28];
bool good;

void init() {
  int i,j,k;
  long gk[16];
  d1count = 6; d2count = 6;
  d1sum = 21; d2sum = 21;
  for (i=0;i<8;i++) {
    xsum[i]=21;ysum[i]=21;
    xcount[i]=7;ycount[i]=7;
    for (j=0;j<8;j++) board[i][j]=7;
  }
  xcount[0]=8;ycount[0]=8;xcount[7]=8;ycount[7]=8;
  xcount[1]=6;ycount[1]=6;xcount[6]=6;ycount[6]=6;
  for (i=0;i<28;i++) 
    dlist[i]=i;
  k=0;
  for (i=0;i<7;i++) for (j=i;j<7;j++) {
    sm[k]=i; bg[k]=j; k++;
  }
  for (i=0;i<28;i++) {
   x1[i]=-1;x2[i]=-1;y1[i]=-1;y2[i]=-1;
  }
  for (i=0;i<8;i++) {
    for (j=0;j<8;j++) {
      cin >> k;
      if (k>=0) 
        if (x1[k]==-1) {
          x1[k] = i;
          y1[k] = j;
        } else {
          x2[k] = i;
          y2[k] = j;
        }
    }
    //cin >> "\n";
  }

}

void print (void) {
  int i,j;
  for (i=0;i<8;i++) {
    for (j=0;j<8;j++) {
      cout << board[i][j] << " ";
    }
    cout << "\n";
  }
  cout << "\n";
}

void swap (int i, int j) {
  int temp;
  temp = dlist[i];
  dlist[i] = dlist[j];
  dlist[j] = temp;
}

void place(int x,int y,int val) {
  board[x][y] = val;
  xsum[x] -= val; 
  xcount[x]--;
    if (xsum[x]<0) good=false;
    else if ((xcount[x]==0)&&(xsum[x]!=0)) good=false;
    else if ((xcount[x]!=0)&&((xsum[x]-1)/xcount[x]>5)) good=false;
  ysum[y] -= val;
  ycount[y]--;
    if (ysum[y]<0) good=false;
    else if ((ycount[y]==0)&&(ysum[y]!=0)) good=false;
    else if ((ycount[y]!=0)&&((ysum[y]-1)/ycount[y]>5)) good=false;
  if (x==y) {
    d1sum -= val;
    d1count--;
    if (d1sum<0) good=false;
    else if ((d1count==0)&&(d1sum!=0)) good=false;
    else if ((d1count!=0)&&((d1sum-1)/d1count>5)) good=false;
  }
  if (x+y==7) {
    d2sum -= val;
    d2count--;
    if (d2sum<0) good=false;
    else if ((d2count==0)&&(d2sum!=0)) good=false;
    else if ((d2count!=0)&&((d2sum-1)/d2count>5)) good=false;
  }
}
void unplace(int x,int y,int val) {
  board[x][y] = 7;
  xsum[x] += val; 
  xcount[x]++;
  ysum[y] += val;
  ycount[y]++;
  if (x==y) {
    d1sum += val;
    d1count++;
  }
  if (x+y==7) {
    d2sum += val;
    d2count++;
  }
}

void recurse (int dom) {
  int pos,act;
  int mx1,mx2,my1,my2,ms,ml;

tots++;
if (tots>=1000000) {
  tots =0;
  print();
}
/*
 tots2++;
if (tots2>=100000) {
if (tots2>=1) {
  tots2 =0;
  cout << dom << " ";
}
*/

if (dom<28) {
  for (pos=dom;pos<28;pos++) {
    swap(dom,pos);
    act = dlist[dom];
    mx1=x1[dom];mx2=x2[dom];my1=y1[dom];my2=y2[dom];
    ms=sm[act];ml=bg[act];

    good = true;
    place(mx1,my1,ms);
    place(mx2,my2,ml);
    if (good) recurse(dom+1);
    unplace(mx1,my1,ms);
    unplace(mx2,my2,ml);

    if (ms!=ml) {
      good = true;
      place(mx1,my1,ml);
      place(mx2,my2,ms);
      if (good) recurse(dom+1);
      unplace(mx1,my1,ml);
      unplace(mx2,my2,ms);
    }

    swap(dom,pos);
  } 
} else {
  cout << "Solution!\n";
  print();
}
}

void main (void) {
  tots=0;
  init();
  recurse(0);
}
