#include <stdlib.h>
#include <stdio.h>
#include "mpi.h"
#define LNSZ  129
#define TAGI  234
#define TAGC  567
int main(int argc, char *argv[] )
{
  char linebuf[LNSZ];
  int ierr, iam, np, itmp ;
  MPI_Status status;

  if ((ierr=MPI_Init(&argc,&argv)) != MPI_SUCCESS) {
    fprintf(stderr,"Something wrong in MPI_Init.\n");
    exit(-1);
  }
  
  ierr = MPI_Comm_rank(MPI_COMM_WORLD,&iam);
  if (ierr==MPI_SUCCESS) ierr = MPI_Comm_size(MPI_COMM_WORLD,&np);
  if (ierr!=MPI_SUCCESS) exit(-1);
  if (np>=2) {
    if (iam == 0) {
      while (fgets(linebuf,LNSZ,stdin)!=NULL) {
	itmp = 1;
	ierr=MPI_Send((void *) &itmp,1,MPI_INT,1,TAGI,MPI_COMM_WORLD);
	ierr=MPI_Send((void *) linebuf,LNSZ,MPI_CHAR,1,TAGC,MPI_COMM_WORLD);
	ierr=MPI_Recv((void *) &itmp,1,MPI_INT,1,TAGI,MPI_COMM_WORLD,&status);
      }
      itmp = 0;
      ierr=MPI_Send((void *) &itmp,1,MPI_INT,1,TAGI,MPI_COMM_WORLD);
    } else if (iam == 1) {
      ierr=MPI_Recv((void *) &itmp,1,MPI_INT,0,TAGI,MPI_COMM_WORLD,&status);
      while (itmp == 1) {
	ierr=MPI_Recv((void *) linebuf,LNSZ,MPI_CHAR,0,TAGC,MPI_COMM_WORLD,&status);
	ierr=MPI_Send((void *) &itmp,1,MPI_INT,0,TAGI,MPI_COMM_WORLD);
	fprintf(stdout,"%s",linebuf);
	ierr=MPI_Recv((void *) &itmp,1,MPI_INT,0,TAGI,MPI_COMM_WORLD,&status);
      }
      
    }
  }

  ierr=MPI_Barrier(MPI_COMM_WORLD);
  ierr=MPI_Finalize();
  
}
