#include <bits/stdc++.h>
using namespace std;
long long get() {
  char c = getchar();
  long long x = 0LL;
  while (c < '0' || c > '9') c = getchar();
  while (c >= '0' && c <= '9') {
    x *= 10LL;
    x += (c - '0');
    c = getchar();
  }
  return x;
}
string i_t_s(int x) {
  string t = "";
  while (x) {
    t += x % 10 + '0';
    x /= 10;
  }
  reverse(t.begin(), t.end());
  return t;
}
int s_t_i(string t) {
  int x = 0;
  for (int i = 0; i < t.size(); i++) {
    x = x * 10 + (t[i] - '0');
  }
  return x;
}
int n, m;
struct edge {
  long long u, v, d;
} e[200010];
bool visit[200010];
vector<long long> v[200010];
long long d[200010];
bool cc;
void dfs(int x) {
  visit[x] = true;
  int nxt = 0;
  for (int i = 0; i < v[x].size(); i++) {
    if (!visit[v[x][i]]) {
      nxt = v[x][i];
      break;
    }
  }
  visit[nxt] = true;
  for (int i = 0; i < v[nxt].size(); i++) {
    if (!visit[v[nxt][i]]) d[v[nxt][i]]--;
  }
}
bool check(int mid) {
  for (int i = 0; i < 2 * n; i++) {
    v[i].clear();
    visit[i] = false;
    d[i] = 0;
  }
  for (int i = 0; i < m; i++) {
    if (e[i].d > mid) continue;
    v[e[i].u].push_back(e[i].v);
    v[e[i].v].push_back(e[i].u);
    d[e[i].u]++;
    d[e[i].v]++;
  }
  for (int i = 0; i < 2 * n; i++) {
    if (visit[i]) continue;
    if (d[i] < 1) {
      return false;
    }
    if (d[i] == 1) {
      dfs(i);
    }
  }
  return true;
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    cin >> e[i].u >> e[i].v >> e[i].d;
    e[i].v += n;
    e[i].u--;
    e[i].v--;
  }
  int l = 0, r = 1e9;
  while (l <= r) {
    int mid = (l + r) / 2;
    if (check(mid)) {
      r = mid - 1;
    } else
      l = mid + 1;
  }
  if (l <= 1e9)
    cout << l;
  else
    cout << -1;
  return 0;
}
