#include <bits/stdc++.h>
using namespace std;
long long n, m, a[100005], S[100005], E[100005], W[100005];
long long parent[100005];
long long l, r = 1e9;
bool flag;
int find(long long v1)
{
while (v1 != parent[v1])
{
v1 = parent[v1];
}
return v1;
}
void _union(long long v1, long long v2)
{
int p1 = find(v1);
int p2 = find(v2);
if (p1 != p2)
{
parent[p1] = p2;
}
}
bool isSame(int v1, int v2)
{
return find(v1) == find(v2);
}
bool check(long long x)
{
for (int i = 1 ; i <= 100005 ; i ++)
{
parent[i] = i;
}
for (int i = 1 ; i <= m ; i ++)
{
if (W[i] >= x)
{
_union(S[i], E[i]);
}
}
for (int i = 1; i <= n; i ++)
{
if (!isSame(i, a[i]))
{
return false;
}
}
return true;
}
int main()
{
cin >> n >> m;
for (int i = 1 ; i <= n ; i ++)
{
scanf("%d", &a[i]);
if (a[i] != i)
{
flag = true;
}
}
for (int i = 1 ; i <= m ; i ++)
{
scanf("%d%d%d", &S[i], &E[i], &W[i]);
_union(S[i], E[i]);
}
if (!flag)
{
puts("-1");
return 0;
}
while (l < r)
{
long long mid = (l + r + 1) >> 1;
if (check(mid))
{
l = mid;
}
else
{
r = mid - 1;
}
}
cout << l;
return 0;
}