
#include<iostream>
#include<stdlib.h>
#include<stack>
using namespace std;
typedef struct btnode *btlink;
typedef int TreeItem;
struct btnode{
TreeItem element;
TreeItem lnum;
TreeItem rnum;
TreeItem flag;
btlink left;
btlink right;
}Btnode,s[10002];
int n;
int count;
int a[10002];
btlink NewNode()
{
btlink p;
if((p=(btlink)malloc(sizeof(Btnode)))== 0);
else return p;
}
typedef struct binarytree *BinaryTree;
typedef struct binarytree{
btlink root;
}BTree;
//将root置为空指针,创建一颗空二叉树
BinaryTree BinaryInit()
{
BinaryTree T=(BinaryTree)malloc(sizeof(struct binarytree));
T->root = 0;
return T;
}
//检测root指针是否为空
int BinaryEmpty(BinaryTree T){return T->root == 0;}
//返回T的根节点标号
TreeItem Root(BinaryTree T)
{
if(BinaryEmpty(T)) ;
return T->root->element;
}
void MakeTree(BinaryTree bt)
{
scanf("%d",&n);
int l,m,r;
for(int i=0;i<n;i++)
{
cin>>s[i].lnum>>s[i].element>>s[i].rnum;
s[i].left = s[i].right =0;
s[i].flag = 0;
}
for(int i=0;i<n;i++)
{
if(s[i].lnum==-1&&s[i].rnum==-1)continue;
else
{
if(s[i].lnum != -1 && s[i].rnum ==-1)
{
for(int j = 0;j < n; j++)
{
if(s[j].element == s[i].lnum){
s[i].left = &s[j];
s[j].flag = 1;
break;
}
}
}
else
if(s[i].rnum != -1 && s[i].lnum == -1)
{
for(int j = 0;j < n ;j++)
{
if(s[j].element == s[i].rnum){
s[i].right = &s[j];
s[j].flag = 1;
break;
}
}
}
else
{
for(int j=0;j < n;j++)
{
if(s[j].element == s[i].lnum){
s[i].left = &s[j];
s[j].flag = 1;
}
if(s[j].element == s[i].rnum){
s[i].right = &s[j];
s[j].flag = 1;
}
}
}
}
}
for(int i=0 ; i < n; i++)
{
if(s[i].flag == 0){
bt->root = &s[i];
break;
}
}
}
int Height(btlink t)
{
int hl,hr;
if(!t)return -1;
hl=Height(t->left);
hr=Height(t->right);
if(hl>hr) return ++hl;
else return ++hr;
}
void visit(btlink t){
printf("%d\n",t->element);
}
void InOrder(btlink t)
{
if(t){
InOrder(t->left);
a[count]=t->element;
count++;
InOrder(t->right);
}
}
void JudgeTree(BinaryTree bt)
{
int legal = 1;
InOrder(bt->root);
for(int i=0;i+1<n;i++){
if(a[i+1]<a[i])
{
legal = 0;
cout<<"-1"<<endl;
break;
}
}
if(legal)cout<<Height(bt->root)+1;
}
int main(){
BinaryTree bt = BinaryInit();
MakeTree(bt);
JudgeTree(bt);
return 0;
}