import tools.*;
import io.*;

class Registro56 extends Program {
  void run() {
    // Se determinan los varones solteros:
    // Para ello se hace un pareo entre el archivo de personas y el
    // archivo de matrimonios, escribiendo en el archivo auxiliar
    // "solteros.dat", las personas con sexo masculino que no aparezcan
    // en el archivo de matrimonios.
    TextReader persLect= new TextReader("personas.dat");
    TextReader matriLect= new TextReader("matrimonios.dat");
    TextWriter soltEscr= new TextWriter("solteros.dat");
    Persona pers= new Persona(persLect);
    Matrimonio matri= new Matrimonio(matriLect);
    while (!persLect.eofReached() && !matriLect.eofReached()) {
      int cmp= compare(pers.cedula, matri.cedulaEsposo);
      if (cmp<0) {
        if (compare(pers.sexo,"m")==0)
          pers.escribir(soltEscr);
        pers= new Persona(persLect);
      }
      else if (cmp>0) // Este caso no se deberia dar
        matri= new Matrimonio(matriLect);
      else {
        pers= new Persona(persLect);
        matri= new Matrimonio(matriLect);
      }
    }
    while (!persLect.eofReached()) {
        if (compare(pers.sexo,"m")==0)
          pers.escribir(soltEscr);
        pers= new Persona(persLect);
    }
    soltEscr.close();
    persLect.close();
    matriLect.close();

    // Ahora encontramos los varones solteros que tengan hijos.
    // Para ello se hace un pareo entre el archivo de solteros
    // y el archivo de hijos, escribiendo en el archivo de padres-solteros
    // los solteros que aparezcan como padres en el archivo de hijos.
    TextReader soltLect= new TextReader("solteros.dat");
    TextReader hijosLect= new TextReader("hijos.dat");
    TextWriter padSolEscr= new TextWriter("padres-solteros.dat");
    Persona solt= new Persona(soltLect);
    Hijo hijo= new Hijo(hijosLect);
    while (!soltLect.eofReached() && !hijosLect.eofReached()) {
      int cmp= compare(solt.cedula, hijo.cedula);
      if (cmp<0) // solt.cedula es un soltero sin hijos
        solt= new Persona(soltLect);
      else if (cmp>0) // hijo.cedula es una madre, no un padre
        hijo= new Hijo(hijosLect);
      else { // solt.cedula si es un padre soltero
        solt.escribir(padSolEscr);
        solt= new Persona(soltLect);
        hijo= new Hijo(hijosLect);
      }
    }
    padSolEscr.close();
    soltLect.close();
    hijosLect.close();
  }
}

class Persona extends Program {
  String cedula;
  String nombre;
  String fechaNac;
  String sexo;
  Persona(TextReader lect) {
    String lin= lect.readLine();
    if (! lect.eofReached()) {
      FieldParser decod= new FieldParser(lin,":");
      cedula= decod.readString();
      nombre= decod.readString();
      fechaNac= decod.readString();
      sexo= decod.readString();
    }
  }
  void escribir(TextWriter escr) {
    escr.println(cedula+":"+nombre+":"+fechaNac+":"+sexo);
  }
}

class Matrimonio extends Program {
  String cedulaEsposo;
  String cedulaEsposa;
  Matrimonio(TextReader lect) {
    String lin= lect.readLine();
    if (! lect.eofReached()) {
      FieldParser decod= new FieldParser(lin,":");
      cedulaEsposo= decod.readString();
      cedulaEsposa= decod.readString();
    }
  }
  void escribir(TextWriter escr) {
    escr.println(cedulaEsposo+":"+cedulaEsposa);
  }
}

class Hijo extends Program {
  String cedulaHijo;
  String cedula;
  Hijo(TextReader lect) {
    String lin= lect.readLine();
    if (! lect.eofReached()) {
      FieldParser decod= new FieldParser(lin,":");
      cedulaHijo= decod.readString();
      cedula= decod.readString();
    }
  }
  void escribir(TextWriter escr) {
    escr.println(cedulaHijo+":"+cedula);
  }
}

