import java.io.*;
import java.util.*;

public class Main {
    static class Node{
        int value;
        Node left;
        Node right;

        public Node(int data){
            this.value=data;
        }
    }

    /*判断是否是搜索二叉树
    神级遍历(Morris)中序遍历    时间复杂度O(N),空间复杂度O(1)
    * */
    public static boolean isBST(Node head){
        if(head==null){
            return true;
        }
        boolean res=true;
        Node pre=null;
        Node cur=head;//当前访问顶点
        Node mostRight=null;
        while (cur != null) {
            mostRight=cur.left;
            //判断是否有左子树
            if (mostRight!=null){
                //找出左子树最右节点
                while (mostRight.right!=null&&mostRight.right!=cur){
                    mostRight=mostRight.right;
                }
                //左子树最右节点的right指针是否为null
                if(mostRight.right==null){
                    mostRight.right=cur;
                    cur=cur.left;
                    continue;
                }else {
                    mostRight.right=null;
                }
            }
            if(pre!=null&&pre.value>cur.value){
                res=false;
            }
            pre=cur;
            cur=cur.right;

        }
        return res;
    }
    /*判断是否为完全二叉树
    1、按层遍历,每层从左边到右边依次遍历
    2、如果当前节点有右节点,但是没有左节点,返回false
    3、如果当前节点并不是左右节点都有,那么之后的节点必须都是叶子节点,否则返回false
    4、遍历过程如果不返回false,最后则返回true
    * */
    public static boolean isCBT(Node head){
        if(head==null){
            return true;
        }
        Queue<Node>queue=new LinkedList<Node>();
        boolean leaf=false;
        Node l=null;
        Node r=null;
        queue.offer(head);
        while (!queue.isEmpty()){
            head=queue.poll();
            l=head.left;
            r=head.right;

            if((leaf&&(l!=null||r!=null))||(l==null&&r!=null)){
                return false;
            }
            if(l!=null){
                queue.offer(l);
            }
            if(r!=null){
                queue.offer(r);
            }else {
                leaf=true;
            }


        }

        return true;
    }


    public static Node createTree(Scanner in,int n){
        int rootValue=in.nextInt();
        Node root=new Node(rootValue);
        HashSet<Node> set=new HashSet<Node>();
        set.add(root);

        //n行读取
        for (int i = 0; i < n; i++) {
            int fatherValue= in.nextInt();
            int leftValue=in.nextInt();
            int rightValue=in.nextInt();
            //遍历
            for (Node e:set){
                //1、比较节点
                if(e.value==fatherValue){
                    //2、建立左右节点
                    Node left= leftValue==0?null:new Node(leftValue);
                    Node right= rightValue==0?null:new Node(rightValue);
                    e.left=left;
                    e.right=right;
                    //3、放入节点
                    if(leftValue!=0){
                        set.add(left);
                    }
                    if(rightValue!=0){
                        set.add(right);
                    }
                    //4、remove
                    set.remove(e);
                    break;
                }
            }

        }


        return root;
    }

    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        Node root=createTree(in,n);

        boolean result1=isBST(root);
        System.out.println(result1);
        boolean result2=isCBT(root);
        System.out.println(result2);
    }
}