#include <bits/stdc++.h>
using namespace std;
class node {
 public:
  int v, l, r;
  node() { v = l = r = 0; }
  node(int _v, int _l, int _r) { v = _v, l = _l, r = _r; }
};
int n;
node a[101010];
bool v[101010];
void sol(int ind, int l, int r) {
  if (a[ind].v >= l && a[ind].v <= r) {
    v[ind] = true;
  }
  if (a[ind].l >= 0) {
    sol(a[ind].l, l, min(r, a[ind].v - 1));
  }
  if (a[ind].r >= 0) {
    sol(a[ind].r, max(l, a[ind].v + 1), r);
  }
  return;
}
int main() {
  scanf("%d", &n);
  bool is_root[n];
  memset(v, 0, sizeof(v));
  memset(is_root, 1, sizeof(is_root));
  for (int i = 0; i < n; i++) {
    int v, l, r;
    scanf("%d %d %d", &v, &l, &r);
    l--, r--;
    a[i] = node(v, l, r);
    if (l >= 0) {
      is_root[l] = false;
    }
    if (r >= 0) {
      is_root[r] = false;
    }
  }
  for (int i = 0; i < n; i++) {
    if (is_root[i]) {
      sol(i, 0, 1000000001);
      break;
    }
  }
  map<int, bool> m;
  for (int i = 0; i < n; i++) {
    if (m.find(a[i].v) != m.end()) {
      m[a[i].v] = max(m[a[i].v], v[i]);
    } else {
      m[a[i].v] = v[i];
    }
  }
  int ret = 0;
  for (int i = 0; i < n; i++) {
    if (!m[a[i].v]) {
      ret++;
    }
  }
  printf("%d\n", ret);
  return 0;
}
