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

#define MAX_N 1000
#define MAX_COST 220000
#define POINTS_FOR_FLOW_ONLY 3
#define POINTS_TOTAL 10

int c[MAX_N + 1][MAX_N + 1];
int reachable[MAX_N + 1];
int points; // Numărul de puncte acumulat
int n;

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

void dfs(int u) {
  reachable[u] = 1;
  for (int v = 1; v <= n; v++) {
    if (c[u][v] && !reachable[v]) {
      dfs(v);
    }
  }
}

int main() {
  int m, u, v, cost, correctFlow, answer;

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

  // Citește fișierul de intrare
  f = fopen("mincut.in", "r");
  if (!f) {
    // Fișierul de intrare nu există
    result("Eroare 1 în configurarea problemei");
  }
  if (fscanf(f, "%d %d", &n, &m) != 2) {
    // Prea puține date
    result("Eroare 2 în configurarea problemei");
  }
  for (int i = 0; i < m; i++) {
    if (fscanf(f, "%d %d %d", &u, &v, &cost) != 3) {
      // Prea puține date
      result("Eroare 3 în configurarea problemei");
    }
    if (u < 1 || u > n || v < 1 || v > n ||
        c[u][v] || cost <= 0 || cost > MAX_COST) {
      // Noduri din afara intervalului, multigraf, costuri greșite
      result("Eroare 4 în configurarea problemei");
    }
    if (u == v) {
      // Self-loops
      result("Eroare 5 în configurarea problemei");
    }
    c[u][v] = cost;
  }
  fclose(f);

  // Citește fișierul de ieșire
  f = fopen("mincut.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 > correctFlow) {
    result("Cost total incorect"); // Cost prea mare
  } else if (answer == correctFlow) {
    // Concurentul își asigură punctaj parțial doar pentru costul exact.
    // Pentru un cost strict mai bun, el trebuie să arate o soluție bine formată.
    points = POINTS_FOR_FLOW_ONLY;
  }

  // Citește câte muchii se poate
  int cutSize = 0;
  while (fscanf(f, "%d %d ", &u, &v) == 2) {
    if (u < 1 || u > n || v < 1 || v > n || !c[u][v]) {
      result("Folosești o muchie inexistentă.");
    }
    cutSize += c[u][v];
    c[u][v] = 0;
  }

  if (!feof(f)) {
    result("Format de ieșire incorect"); // Prea multe comenzi
  }
  fclose(f);

  if (cutSize != answer) {
    result("Suma costurilor muchiilor nu este egală cu costul tăieturii.");
  }

  dfs(1);
  if (reachable[n]) {
    result("Muchiile propuse nu separă nodurile 1 și n.");
  }

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