import choco.Problem;
import choco.Constraint;
import choco.Solver;
import choco.Solution;
import choco.ContradictionException;
import choco.integer.IntVar;
import choco.search.AssignVar;

import java.io.*;
import java.lang.*;
import java.util.*;

public class FBuild {	
   

    public static void main(String[] args) throws Exception,ContradictionException,FileNotFoundException,IOException {
	
	Dict d = new Dict();
	MyIo fin = new MyIo(args[0]);
	int n = fin.getNextInt();
	Tree t[] = new Tree[n];
	for (int i=0;i<n;i++) t[i] = new Tree(fin.getNextString(),d);

	Vector triples = new Vector();
	Vector fans    = new Vector();

	for (int i=0;i<n;i++) t[i].breakUp(triples,fans);

	Tree t3 = new Tree();

	boolean solution = true;

	long ms1 = System.currentTimeMillis();
	try {Tree.OneTree(triples,fans,t3.getRoot(),d,t3);}
	catch (Exception e) {solution = false;}
	long ms2 = System.currentTimeMillis();

	if (solution)
	    System.out.println(t3);
	else
	    System.out.println("();");
	System.out.println(ms2-ms1 + "ms");

	/*

	for (int i=0;i<triples.size();i++)
	    System.out.println((Triple)triples.get(i));

	System.out.println("********************************");

	for (int i=0;i<fans.size();i++)
	    System.out.println((Triple)fans.get(i));

	*/
    }
}	    
