#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <deque>
#include <functional>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <cassert>
#include <fstream>
#include <sstream>
#include <numeric>
#include <iterator>
#include <iomanip>
#define int long long
using namespace std;
#define all(c) c.begin(), c.end()
#define rall(c) c.rbegin(), c.rend()
const int INF = 1LL << 60;
const int NEG_INF = -1000000000000000000LL;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<bool> vb;
typedef vector<vector<int>> vvi;
typedef vector<vector<bool>> vvb;
typedef vector<pair<int, int>> vpii;
typedef vector<set<int>> vsi;
typedef vector<pair<int, pair<int, int>>> vpipii;
typedef set<int> si;
typedef set<char> sc;
typedef map<int, int> mii;
typedef map<int, pair<int, int>> mipii;
typedef map<pair<int, int>, int> mpiii;
typedef vector<double> vd;
typedef vector<pair<double, double>> vpdd;
typedef multiset<int> msi;
typedef queue<int> qi;
#define mp make_pair
#define pb push_back
#define line "\n"
#define FOR(i, a, b) for (int i = a; i < b; i++)
#define F0R(i, a) for (int i = 0; i < a; i++)
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound
vector<int> vector_set(vector<int> indices) {
sort(indices.begin(), indices.end());
indices.erase(unique(indices.begin(), indices.end()), indices.end());
return indices;
}
int first_true(int lo, int hi, function<bool(int)> f) {
hi++;
while (lo < hi) {
int mid = lo + (hi - lo) / 2;
if (f(mid)) hi = mid;
else lo = mid + 1;
}
return lo;
}
int last_true(int lo, int hi, function<bool(int)> f) {
lo--;
while (lo < hi) {
int mid = lo + (hi - lo + 1) / 2;
if (f(mid)) lo = mid;
else hi = mid - 1;
}
return lo;
}
double first_true_double(double lo, double hi, std::function<bool(double)> f, double eps = 1e-6) {
while (hi - lo > eps) {
double mid = lo + (hi - lo) / 2.0;
if (f(mid))
hi = mid;
else
lo = mid;
}
return hi;
}
double last_true_double(double lo, double hi, std::function<bool(double)> f, double eps = 1e-6) {
while (hi - lo > eps) {
double mid = lo + (hi - lo) / 2.0;
if (f(mid))
lo = mid;
else
hi = mid;
}
return lo;
}
const int N = 1e6;
vvi graph(N);
mpiii location;
void dfs(int node, int width, vb &vis, vi &travel) {
if (vis[node]) return;
vis[node] = true;
travel.pb(node);
for (int adj : graph[node]) {
int current_width = location[{node, adj}];
if (current_width <= width)
dfs(adj, width, vis, travel);
}
}
void solve() {
int n, m;
cin >> n >> m;
vi p(n), w(m + 1);
w[0] = 0;
F0R(i, n)
cin >> p[i];
F0R(i, m) {
int x, y;
cin >> x >> y >> w[i + 1];
x--; y--;
graph[x].pb(y);
graph[y].pb(x);
location[{x, y}] = w[i + 1];
location[{y, x}] = w[i + 1];
}
sort(all(w));
int ans = first_true(0, m, [&](int x) {
int width = w[x];
// Reinitialize the visited vector and clear component storage
vb vis(n, false);
vvi travel_complete;
// Run DFS for each component with the current threshold
F0R(i, n) {
if (!vis[i]) {
vi travel;
dfs(i, width, vis, travel);
travel_complete.pb(travel);
}
}
// Build DSU-like connectivity sets
vsi dsu(n);
for (auto comp : travel_complete) {
for (int k : comp) {
// Insert all nodes from the component into dsu[k]
dsu[k].insert(comp.begin(), comp.end());
}
}
bool ok = false;
F0R(i, n) {
if (i != p[i]) {
if (dsu[i].find(p[i]) != dsu[i].end()) {
ok = true;
break;
}
}
}
return !ok;
});
if(ans == 0) cout << -1 << line;
else cout << w[ans] << line;
}
int32_t main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int t = 1;
while(t-- > 0) {
solve();
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxzdGFjaz4KI2luY2x1ZGUgPGRlcXVlPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPGJpdHNldD4KI2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxjbGltaXRzPgojaW5jbHVkZSA8Y2Fzc2VydD4KI2luY2x1ZGUgPGZzdHJlYW0+CiNpbmNsdWRlIDxzc3RyZWFtPgojaW5jbHVkZSA8bnVtZXJpYz4KI2luY2x1ZGUgPGl0ZXJhdG9yPgojaW5jbHVkZSA8aW9tYW5pcD4KCiNkZWZpbmUgaW50IGxvbmcgbG9uZwp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIGFsbChjKSBjLmJlZ2luKCksIGMuZW5kKCkKI2RlZmluZSByYWxsKGMpIGMucmJlZ2luKCksIGMucmVuZCgpCmNvbnN0IGludCBJTkYgPSAxTEwgPDwgNjA7CmNvbnN0IGludCBORUdfSU5GID0gLTEwMDAwMDAwMDAwMDAwMDAwMDBMTDsKdHlwZWRlZiBwYWlyPGludCwgaW50PiBwaWk7CnR5cGVkZWYgdmVjdG9yPGludD4gdmk7CnR5cGVkZWYgdmVjdG9yPGJvb2w+IHZiOwp0eXBlZGVmIHZlY3Rvcjx2ZWN0b3I8aW50Pj4gdnZpOwp0eXBlZGVmIHZlY3Rvcjx2ZWN0b3I8Ym9vbD4+IHZ2YjsKdHlwZWRlZiB2ZWN0b3I8cGFpcjxpbnQsIGludD4+IHZwaWk7CnR5cGVkZWYgdmVjdG9yPHNldDxpbnQ+PiB2c2k7CnR5cGVkZWYgdmVjdG9yPHBhaXI8aW50LCBwYWlyPGludCwgaW50Pj4+IHZwaXBpaTsKdHlwZWRlZiBzZXQ8aW50PiBzaTsKdHlwZWRlZiBzZXQ8Y2hhcj4gc2M7CnR5cGVkZWYgbWFwPGludCwgaW50PiBtaWk7CnR5cGVkZWYgbWFwPGludCwgcGFpcjxpbnQsIGludD4+IG1pcGlpOwp0eXBlZGVmIG1hcDxwYWlyPGludCwgaW50PiwgaW50PiBtcGlpaTsKdHlwZWRlZiB2ZWN0b3I8ZG91YmxlPiB2ZDsKdHlwZWRlZiB2ZWN0b3I8cGFpcjxkb3VibGUsIGRvdWJsZT4+IHZwZGQ7CnR5cGVkZWYgbXVsdGlzZXQ8aW50PiBtc2k7CnR5cGVkZWYgcXVldWU8aW50PiBxaTsKI2RlZmluZSBtcCBtYWtlX3BhaXIKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBsaW5lICJcbiIKCiNkZWZpbmUgRk9SKGksIGEsIGIpIGZvciAoaW50IGkgPSBhOyBpIDwgYjsgaSsrKQojZGVmaW5lIEYwUihpLCBhKSBmb3IgKGludCBpID0gMDsgaSA8IGE7IGkrKykKCiNkZWZpbmUgZiBmaXJzdAojZGVmaW5lIHMgc2Vjb25kCiNkZWZpbmUgbGIgbG93ZXJfYm91bmQKI2RlZmluZSB1YiB1cHBlcl9ib3VuZAoKdmVjdG9yPGludD4gdmVjdG9yX3NldCh2ZWN0b3I8aW50PiBpbmRpY2VzKSB7CiAgICBzb3J0KGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSk7CiAgICBpbmRpY2VzLmVyYXNlKHVuaXF1ZShpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCkpLCBpbmRpY2VzLmVuZCgpKTsKICAgIHJldHVybiBpbmRpY2VzOwp9CmludCBmaXJzdF90cnVlKGludCBsbywgaW50IGhpLCBmdW5jdGlvbjxib29sKGludCk+IGYpIHsKICAgIGhpKys7CiAgICB3aGlsZSAobG8gPCBoaSkgewogICAgICAgIGludCBtaWQgPSBsbyArIChoaSAtIGxvKSAvIDI7CiAgICAgICAgaWYgKGYobWlkKSkgaGkgPSBtaWQ7CiAgICAgICAgZWxzZSBsbyA9IG1pZCArIDE7CiAgICB9CiAgICByZXR1cm4gbG87Cn0KaW50IGxhc3RfdHJ1ZShpbnQgbG8sIGludCBoaSwgZnVuY3Rpb248Ym9vbChpbnQpPiBmKSB7CiAgICBsby0tOwogICAgd2hpbGUgKGxvIDwgaGkpIHsKICAgICAgICBpbnQgbWlkID0gbG8gKyAoaGkgLSBsbyArIDEpIC8gMjsKICAgICAgICBpZiAoZihtaWQpKSBsbyA9IG1pZDsKICAgICAgICBlbHNlIGhpID0gbWlkIC0gMTsKICAgIH0KICAgIHJldHVybiBsbzsKfQpkb3VibGUgZmlyc3RfdHJ1ZV9kb3VibGUoZG91YmxlIGxvLCBkb3VibGUgaGksIHN0ZDo6ZnVuY3Rpb248Ym9vbChkb3VibGUpPiBmLCBkb3VibGUgZXBzID0gMWUtNikgewogICAgd2hpbGUgKGhpIC0gbG8gPiBlcHMpIHsKICAgICAgICBkb3VibGUgbWlkID0gbG8gKyAoaGkgLSBsbykgLyAyLjA7CiAgICAgICAgaWYgKGYobWlkKSkKICAgICAgICAgICAgaGkgPSBtaWQ7CiAgICAgICAgZWxzZQogICAgICAgICAgICBsbyA9IG1pZDsKICAgIH0KICAgIHJldHVybiBoaTsKfQpkb3VibGUgbGFzdF90cnVlX2RvdWJsZShkb3VibGUgbG8sIGRvdWJsZSBoaSwgc3RkOjpmdW5jdGlvbjxib29sKGRvdWJsZSk+IGYsIGRvdWJsZSBlcHMgPSAxZS02KSB7CiAgICB3aGlsZSAoaGkgLSBsbyA+IGVwcykgewogICAgICAgIGRvdWJsZSBtaWQgPSBsbyArIChoaSAtIGxvKSAvIDIuMDsKICAgICAgICBpZiAoZihtaWQpKQogICAgICAgICAgICBsbyA9IG1pZDsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGhpID0gbWlkOwogICAgfQogICAgcmV0dXJuIGxvOwp9Cgpjb25zdCBpbnQgTiA9IDFlNjsKdnZpIGdyYXBoKE4pOwptcGlpaSBsb2NhdGlvbjsKCnZvaWQgZGZzKGludCBub2RlLCBpbnQgd2lkdGgsIHZiICZ2aXMsIHZpICZ0cmF2ZWwpIHsKICAgIGlmICh2aXNbbm9kZV0pIHJldHVybjsKICAgIHZpc1tub2RlXSA9IHRydWU7CiAgICB0cmF2ZWwucGIobm9kZSk7CiAgICBmb3IgKGludCBhZGogOiBncmFwaFtub2RlXSkgewogICAgICAgIGludCBjdXJyZW50X3dpZHRoID0gbG9jYXRpb25be25vZGUsIGFkan1dOwogICAgICAgIGlmIChjdXJyZW50X3dpZHRoIDw9IHdpZHRoKQogICAgICAgICAgICBkZnMoYWRqLCB3aWR0aCwgdmlzLCB0cmF2ZWwpOwogICAgfQp9Cgp2b2lkIHNvbHZlKCkgewogICAgaW50IG4sIG07IAogICAgY2luID4+IG4gPj4gbTsKICAgIHZpIHAobiksIHcobSArIDEpOyAKICAgIHdbMF0gPSAwOwogICAgRjBSKGksIG4pIAogICAgICAgIGNpbiA+PiBwW2ldOwogICAgRjBSKGksIG0pIHsKICAgICAgICBpbnQgeCwgeTsgCiAgICAgICAgY2luID4+IHggPj4geSA+PiB3W2kgKyAxXTsKICAgICAgICB4LS07IHktLTsKICAgICAgICBncmFwaFt4XS5wYih5KTsKICAgICAgICBncmFwaFt5XS5wYih4KTsKICAgICAgICBsb2NhdGlvblt7eCwgeX1dID0gd1tpICsgMV07CiAgICAgICAgbG9jYXRpb25be3ksIHh9XSA9IHdbaSArIDFdOwogICAgfQogICAgc29ydChhbGwodykpOwogICAgaW50IGFucyA9IGZpcnN0X3RydWUoMCwgbSwgWyZdKGludCB4KSB7CiAgICAgICAgaW50IHdpZHRoID0gd1t4XTsKICAgICAgICAvLyBSZWluaXRpYWxpemUgdGhlIHZpc2l0ZWQgdmVjdG9yIGFuZCBjbGVhciBjb21wb25lbnQgc3RvcmFnZQogICAgICAgIHZiIHZpcyhuLCBmYWxzZSk7CiAgICAgICAgdnZpIHRyYXZlbF9jb21wbGV0ZTsKICAgICAgICAvLyBSdW4gREZTIGZvciBlYWNoIGNvbXBvbmVudCB3aXRoIHRoZSBjdXJyZW50IHRocmVzaG9sZAogICAgICAgIEYwUihpLCBuKSB7CiAgICAgICAgICAgIGlmICghdmlzW2ldKSB7CiAgICAgICAgICAgICAgICB2aSB0cmF2ZWw7CiAgICAgICAgICAgICAgICBkZnMoaSwgd2lkdGgsIHZpcywgdHJhdmVsKTsKICAgICAgICAgICAgICAgIHRyYXZlbF9jb21wbGV0ZS5wYih0cmF2ZWwpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIEJ1aWxkIERTVS1saWtlIGNvbm5lY3Rpdml0eSBzZXRzCiAgICAgICAgdnNpIGRzdShuKTsKICAgICAgICBmb3IgKGF1dG8gY29tcCA6IHRyYXZlbF9jb21wbGV0ZSkgewogICAgICAgICAgICBmb3IgKGludCBrIDogY29tcCkgewogICAgICAgICAgICAgICAgLy8gSW5zZXJ0IGFsbCBub2RlcyBmcm9tIHRoZSBjb21wb25lbnQgaW50byBkc3Vba10KICAgICAgICAgICAgICAgIGRzdVtrXS5pbnNlcnQoY29tcC5iZWdpbigpLCBjb21wLmVuZCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBib29sIG9rID0gZmFsc2U7CiAgICAgICAgRjBSKGksIG4pIHsKICAgICAgICAgICAgaWYgKGkgIT0gcFtpXSkgewogICAgICAgICAgICAgICAgaWYgKGRzdVtpXS5maW5kKHBbaV0pICE9IGRzdVtpXS5lbmQoKSkgewogICAgICAgICAgICAgICAgICAgIG9rID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gIW9rOwogICAgfSk7CiAgICBpZihhbnMgPT0gMCkgY291dCA8PCAtMSA8PCBsaW5lOwogICAgZWxzZSBjb3V0IDw8IHdbYW5zXSA8PCBsaW5lOwp9CgppbnQzMl90IG1haW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUoTlVMTCk7CiAgICBjb3V0LnRpZShOVUxMKTsKICAgIGludCB0ID0gMTsKICAgIHdoaWxlKHQtLSA+IDApIHsKICAgICAgICBzb2x2ZSgpOwogICAgfQogICAgcmV0dXJuIDA7Cn0K