#include <bits/stdc++.h>
using namespace std;
typedef struct EDGE {
  int u;
  int v;
  int w;
  bool operator<(EDGE b) const { return w < b.w; }
} Ed;
Ed edges[100010];
int match_a[10010];
int match_b[10010];
int marc[10010];
int vet[10010];
vector<pair<int, int> > grafo[10010];
int MCBM = 0;
int esq, dir, mid = 3;
bool BM(int u) {
  int i;
  pair<int, int> v;
  for (i = 0; i < grafo[u].size(); i++) {
    v = grafo[u][i];
    if (v.second > mid) {
      break;
    }
    if (marc[v.first] == false) {
      marc[v.first] = true;
      if (match_b[v.first] == -1 || BM(match_b[v.first]) == true) {
        match_b[v.first] = u;
        match_a[u] = v.first;
        return true;
      }
    }
  }
  return false;
}
int main() {
  int n, m, u, v, w, MCBM = 0, i;
  bool aux;
  scanf("%d %d", &n, &m);
  for (i = 1; i <= m; i++) {
    scanf("%d %d %d", &u, &v, &w);
    edges[i].u = u;
    edges[i].v = v;
    edges[i].w = w;
  }
  sort(edges + 1, edges + m + 1);
  for (i = 1; i <= m; i++) {
    u = edges[i].u;
    v = edges[i].v;
    w = edges[i].w;
    grafo[u].push_back(make_pair(v, w));
  }
  esq = 0;
  dir = 1000000010;
  while (esq <= dir) {
    mid = (esq + dir) / 2;
    MCBM = 0;
    memset(match_a, -1, sizeof match_a);
    memset(match_b, -1, sizeof match_b);
    aux = true;
    while (aux == true) {
      memset(marc, false, sizeof marc);
      aux = false;
      for (i = 1; i <= n; i++) {
        if (match_a[i] == -1) {
          if (BM(i) == true) {
            MCBM++;
            aux = true;
          }
        }
      }
    }
    if (MCBM == n) {
      dir = mid - 1;
    } else {
      esq = mid + 1;
    }
  }
  if (esq == 1000000011) {
    cout << -1 << endl;
  } else {
    cout << esq << endl;
  }
  return 0;
}
