import choco.Problem;
import choco.Constraint;
import choco.Solver;
import choco.Solution;
import choco.ContradictionException;
import choco.integer.IntVar;
//import choco.search.AssignVar;
import choco.search.AbstractGlobalSearchSolver;
import choco.search.AbstractGlobalSearchLimit;
import choco.integer.search.*;
import java.io.*;
import java.lang.*;
import java.util.*;

public class XPlain {	
   

    public static void main(String[] args) throws Exception,ContradictionException,FileNotFoundException,IOException {
	
	int noFiles = args.length;
	long ms1 = System.currentTimeMillis();
	Dict d = new Dict();
	Tree t1 = new Tree(args[0],d);
	Tree t2 = new Tree(args[1],d);

	Problem pb = new Problem();
	int m = d.size();

	UMatrix um = new UMatrix(m-1,pb,d,false);

	t1.breakUp(um);
	t2.breakUp(um);
	//t1.XbreakUp(um);
	//t2.XbreakUp(um);
	
	ArrayList S1 = um.getTriples(t1);
	ArrayList S2 = um.getTriples(t2);
	ArrayList S3 = new ArrayList();

	for (int i=0;i<S1.size();i++) ((Triple)S1.get(i)).post();

	pb.propagate();

	boolean consistent = true;

	while (consistent) {
	    pb.worldPush();
	    for (int i=0;i<S3.size() && consistent;i++){
		((Triple)S3.get(i)).post();
		try {pb.propagate();}
		catch (Exception e) {consistent = false;}
		//System.out.println("S3.post: " + S3.get(i));
	    }
	    if (consistent){
		for (int i=0;i<S2.size() && consistent;i++){
		    ((Triple)S2.get(i)).post();
		    try {pb.propagate();}
		    catch (Exception e) {consistent = false;}
		    //System.out.println("S2.post: " + S2.get(i));
		    if (!consistent){
			S3.add(S2.get(i));
			//System.out.println("----->: " + S2.get(i));
			S2.remove(i);
		    }
		}
		consistent = true;
	    }
	    pb.worldPop();
	}

	for (int i=0;i<S3.size();i++) System.out.println((Triple)S3.get(i));
    }
}
