#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_N 100000
#define NIL -1
#define POINTS_FOR_SCORE_ONLY 3
#define POINTS_TOTAL 10

typedef struct {
  int v, next;
} list;

int adj[MAX_N];        // începuturile listor de adiacență
list e[2 * MAX_N - 2]; // celulele din liste, alocate static
int n;
int points; // Numărul de puncte acumulat

void result(const char *msg) {
  fprintf(stderr, "%s", msg);
  printf("%d", points);
  exit(0);
}

// Adaugă v la lista de adiacență a lui u folosind celula e[pos]
void addEdge(int u, int v, int pos) {
  e[pos].v = v;
  e[pos].next = adj[u];
  adj[u] = pos;
}

int main() {
  int correctDiameter, answer;

  // Citește fișierul OK
  FILE *f = fopen("diametru.ok", "r");
  if (!f) {
    result("Fișierul OK nu există.");
  }
  if (fscanf(f, "%d ", &correctDiameter) != 1) {
    result("Fișierul OK nu conține destule date.");
  }
  fclose(f);

  // Citește fișierul de intrare
  f = fopen("diametru.in", "r");
  if (!f) {
    // Fișierul de intrare nu există
    result("Fișierul de intrare nu există.");
  }
  if (fscanf(f, "%d", &n) != 1) {
    // Prea puține date
    result("Fișierul de intrare nu conține destule date.");
  }
  for (int i = 0; i < n; i++) {
    adj[i] = NIL;
  }
  for (int i = 0; i < n - 1; i++) {
    int u, v;
    if (fscanf(f, "%d %d", &u, &v) != 2) {
      result("Fișierul de intrare nu conține destule date.");
    }
    addEdge(u - 1, v - 1, 2 * i);
    addEdge(v - 1, u - 1, 2 * i + 1);
  }
  fclose(f);

  // Citește fișierul de ieșire
  f = fopen("diametru.out", "r");
  if (!f) {
    result("Fișierul de ieșire nu există.");
  }
  if (fscanf(f, "%d", &answer) != 1) {
    result("Fișierul de ieșire nu conține destule date.");
  }
  if (answer != correctDiameter) {
    result("Diametru incorect");
  }

  points = POINTS_FOR_SCORE_ONLY;

  // Citește calea și o urmează
  int u, from = NIL;
  if (fscanf(f, "%d", &u) != 1) {
    result("Calea este incompletă.");
  }
  if (u < 1 || u > n) {
    result("Calea conține noduri din afara intervalului [1, n].");
  }
  u--;
  for (int i = 0; i < correctDiameter; i++) {
    int v;
    if (fscanf(f, "%d ", &v) != 1) {
      result("Calea este incompletă.");
    }
    if (v < 1 || v > n) {
      result("Calea conține noduri din afara intervalului [1, n].");
    }
    v--;
    // Ne asigurăm că există o muchie (u, v) și nu a fost deja parcursă (adineauri).
    if (v == from) {
      result("Calea conține cicluri.");
    }
    int pos = adj[u];
    while (pos != NIL && e[pos].v != v) {
      pos = e[pos].next;
    }
    if (pos == NIL) {
      result("Calea încearcă să traverseze o muchie care nu există.");
    }
    from = u;
    u = v;
  }

  if (!feof(f)) {
    result("Fișierul de ieșire conține prea multe date.");
  }
  fclose(f);

  points = POINTS_TOTAL;
  result("OK");
}
