#include <stdio.h>
#include <algorithm>
#include <vector>

using namespace std;

#define E_NO_INPUT "Fisier de intrare lipsa"
#define E_BAD_INPUT "Fisier de intrare corupt"
#define E_NO_OUTPUT "Fisier de iesire lipsa"
#define E_BAD_OUTPUT "Eroare in fisierul de iesire"
#define E_NO_OK "Fisier ok lipsa"
#define E_BAD_OK "Fisier ok corupt"
#define E_WRONG_ANSWER "Raspuns gresit"
#define E_OK "OK!!"
#define MAX_N 5005
#define FIN "sortare.in"
#define FOUT "sortare.out"
#define FOK "sortare.ok"

typedef vector<int> VI;

int N, A[MAX_N], B[MAX_N], C[MAX_N], HOK, HOUT, H;
char U[MAX_N]; VI P;

void result(char msg[], int p = 0)
{
    fprintf(stderr, msg);
    printf("%d", p);
    exit(0);
}

inline int median(int a, int b, int c)
{
    int t[3] = {a, b, c};

    if (t[0] > t[1]) swap(t[0], t[1]);
    if (t[0] > t[2]) swap(t[0], t[2]);
    if (t[1] > t[2]) swap(t[1], t[2]);
    return t[1];
}

void sort(VI &P, int h = 1)
{
    H = max(H, h);
    if (P.size() <= 1) return;
    int p = median(P[A[P.size()]], P[B[P.size()]], P[C[P.size()]]);
    VI L, R;
    for (VI::iterator it = P.begin(); it != P.end(); ++it)
    {
        if (*it < p) L.push_back(*it);
        if (*it > p) R.push_back(*it);
    }
    P.clear();
    sort(L, h+1);
    sort(R, h+1);
    P.insert(P.end(), L.begin(), L.end());
    P.push_back(p);
    P.insert(P.end(), R.begin(), R.end());
}

int main(void)
{
   FILE *f_in, *f_ok, *f_out;
   int i, t;

    f_in = fopen(FIN, "r");
    if (!f_in) result(E_NO_INPUT);
    if (fscanf(f_in, "%d", &N) != 1)
        result(E_BAD_INPUT);
    if (N < 1 || N > 5000)
        result(E_BAD_INPUT);
    for (i = 2; i <= N; ++i)
    {
        if (fscanf(f_in, "%d %d %d", A+i, B+i, C+i) != 3)
            result(E_BAD_INPUT);
        if (A[i] < 1 || A[i] > i || B[i] < 1 || B[i] > i || C[i] < 1 || C[i] > i)
            result(E_BAD_INPUT);
        A[i]--; B[i]--; C[i]--;
    }

    f_ok = fopen(FOK, "r");
    if (!f_ok) result(E_NO_OK);
    f_out = fopen(FOUT, "r");
    if (!f_out) result(E_NO_OUTPUT);

    if (fscanf(f_ok, "%d", &HOK) != 1)
        result(E_BAD_OK);
    if (fscanf(f_out, "%d", &HOUT) != 1)
        result(E_BAD_OUTPUT);
    if (HOK != HOUT)
        result(E_WRONG_ANSWER);

    for (i = 0; i < N; ++i)
    {
        if (fscanf(f_out, "%d", &t) != 1)
            result(E_BAD_OUTPUT);
        P.push_back(t);
        if (P[i] < 1 || P[i] > N || U[P[i]])
            result(E_BAD_OUTPUT);
        U[P[i]] = 1;
    }

    sort(P);

    if (H != HOK)
       result(E_WRONG_ANSWER);
    result(E_OK, 5);
    
    return 0;
}
