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;
        }
    }

    /*判断二叉树是否是平衡二叉树
    树形dp问题
    第1步:以某个节点X为头节点,分析答案可能情况
        可能1:X左子树不平衡,则以X为头节点的树不平衡
        可能2:X右子树不平衡,则以X为头节点的树不平衡
        可能3:X的左右子树高度差大于1,则以X为头节点的树不平衡
        可能4:上面都没有,以X为头节点的树平衡
    第2步:根据可能性分析,列出所有需要的信息。左右子树都需要知道各自是否平衡,以及高度
    第3步:根据第2步信息汇总,定义ReturnType类
    * */
    public static class ReturnType{
        public boolean isBalanced;
        public int height;

        public ReturnType(boolean isBalanced, int height) {
            this.isBalanced = isBalanced;
            this.height = height;
        }
    }

    /*第4步:设计递归函数。递归函数是处理以X为头节点的情况下的***括设计递归的base case,
    默认直接得到左树、右树所有信息,以及把可能性整合,返回到第3步信息结构这四个小步骤
    * */
    public static ReturnType process(Node head){
        if(head==null){
            return new ReturnType(true,0);
        }
        ReturnType leftData=process(head.left);
        ReturnType rightData=process(head.right);

        int height=Math.max(leftData.height, rightData.height)+1;
        boolean isBalanced=leftData.isBalanced&& rightData.isBalanced
                && Math.abs(leftData.height- rightData.height)<2;

        return  new ReturnType(isBalanced,height);
    }

    public static boolean isBalanced(Node head){
        return process(head).isBalanced;
    }

    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;
    }
    /*
    in:3 1
        1 2 3
        2 0 0
        3 0 0
    out:true
    * */
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        Node root=createTree(in,n);

        boolean result=isBalanced(root);
        System.out.println(result);
    }
}