#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

typedef struct Node {
    int val;
    struct Node* left;
    struct Node* right;
} Node;

typedef struct {
    int val, left_val, right_val;
} InputNode;

Node* createNode(int val) {
    Node* n = (Node*)malloc(sizeof(Node));
    if (!n) {
        printf("Invalid input\n");
        exit(0);
    }
    n->val = val;
    n->left = NULL;
    n->right = NULL;
    return n;
}

void connectNodes(Node** nodes, int n, InputNode* inputs) {
    for (int i = 0; i < n; i++) {
        if (inputs[i].left_val != -1) {
            int found = 0;
            for (int j = 0; j < n; j++) {
                if (nodes[j]->val == inputs[i].left_val) {
                    nodes[i]->left = nodes[j];
                    found = 1;
                    break;
                }
            }
            if (!found) {
                printf("Invalid input\n");
                exit(0);
            }
        }
        if (inputs[i].right_val != -1) {
            int found = 0;
            for (int j = 0; j < n; j++) {
                if (nodes[j]->val == inputs[i].right_val) {
                    nodes[i]->right = nodes[j];
                    found = 1;
                    break;
                }
            }
            if (!found) {
                printf("Invalid input\n");
                exit(0);
            }
        }
    }
}

Node* findRoot(Node** nodes, int n, InputNode* inputs) {
    int* isChild = (int*)calloc(n, sizeof(int));
    if (!isChild) {
        printf("Invalid input\n");
        exit(0);
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (inputs[j].left_val == inputs[i].val) isChild[i] = 1;
            if (inputs[j].right_val == inputs[i].val) isChild[i] = 1;
        }
    }
    int rootIndex = -1;
    for (int i = 0; i < n; i++) {
        if (!isChild[i]) {
            if (rootIndex != -1) {
                free(isChild);
                return NULL;
            }
            rootIndex = i;
        }
    }
    free(isChild);
    if (rootIndex == -1) return NULL;
    return nodes[rootIndex];
}

void findClosest(Node* root, int T, int* closestVal, int* minDiff) {
    if (!root) return;
    int diff = abs(root->val - T);
    if (diff < *minDiff || (diff == *minDiff && root->val < *closestVal)) {
        *minDiff = diff;
        *closestVal = root->val;
    }
    if (T < root->val)
        findClosest(root->left, T, closestVal, minDiff);
    else if (T > root->val)
        findClosest(root->right, T, closestVal, minDiff);
    else
        return;  // exact match found
}

int main() {
    int N;
    if (scanf("%d", &N) != 1 || N < 1 || N > 10000) {
        printf("Invalid input\n");
        return 0;
    }

    InputNode* inputs = (InputNode*)malloc(sizeof(InputNode) * N);
    if (!inputs) {
        printf("Invalid input\n");
        return 0;
    }

    for (int i = 0; i < N; i++) {
        if (scanf("%d %d %d", &inputs[i].val, &inputs[i].left_val, &inputs[i].right_val) != 3) {
            printf("Invalid input\n");
            free(inputs);
            return 0;
        }
        if (inputs[i].val < 1 || inputs[i].val > 100000 ||
            (inputs[i].left_val != -1 && (inputs[i].left_val < 1 || inputs[i].left_val > 100000)) ||
            (inputs[i].right_val != -1 && (inputs[i].right_val < 1 || inputs[i].right_val > 100000))) {
            printf("Invalid input\n");
            free(inputs);
            return 0;
        }
    }

    int T;
    if (scanf("%d", &T) != 1 || T < 1 || T > 100000) {
        printf("Invalid input\n");
        free(inputs);
        return 0;
    }

    // Create nodes
    Node** nodes = (Node*)malloc(sizeof(Node) * N);
    if (!nodes) {
        printf("Invalid input\n");
        free(inputs);
        return 0;
    }

    for (int i = 0; i < N; i++) {
        nodes[i] = createNode(inputs[i].val);
    }

    connectNodes(nodes, N, inputs);

    Node* root = findRoot(nodes, N, inputs);
    if (!root) {
        printf("Invalid input\n");
        free(inputs);
        free(nodes);
        return 0;
    }

    int closestVal = -1;
    int minDiff = INT_MAX;

    findClosest(root, T, &closestVal, &minDiff);

    if (closestVal == -1) {
        printf("Invalid input\n");
    } else {
        printf("%d\n", closestVal);
    }

    free(inputs);
    free(nodes);

    return 0;
}