// Java program for the above approach
import java.util.*;
// Implementation of DSU
class UnionFind {
private int[] parent;
private int[] rank;
private int time;
private int count;
public UnionFind(int N)
{
parent = new int[N];
rank = new int[N];
time = 0;
count = N;
for (int i = 0; i < N; i++) {
parent[i] = i;
rank[i] = 1;
}
}
public int find(int node)
{
if (node == parent[node])
return node;
return parent[node] = find(parent[node]);
}
public void performUnion(int u, int v, int updatedTime)
{
if (count == 1)
return;
int rootX = find(u);
int rootY = find(v);
if (rootX != rootY) {
if (rank[rootX] < rank[rootY]) {
parent[rootX] = rootY;
}
else if (rank[rootX] > rank[rootY]) {
parent[rootY] = rootX;
}
else {
parent[rootX] = rootY;
rank[rootY] += 1;
}
time = updatedTime;
count--;
}
}
public int getCount() { return count; }
public int getTime() { return time; }
}
class Main {
private static int earliestTime(List arr, int N)
{
arr.sort(Comparator.comparingInt(a -> a[2]));
UnionFind unionFind = new UnionFind(N);
for (int[] it : arr) {
unionFind.performUnion(it[0], it[1], it[2]);
}
return unionFind.getCount() == 1
? unionFind.getTime()
: -1;
}
public static void main(String[] args)
{
int N = 6;
List arr
= Arrays.asList(new int[][] { { 0, 1, 4 },
{ 3, 4, 5 },
{ 2, 3, 14 },
{ 1, 5, 24 },
{ 2, 4, 12 },
{ 0, 3, 42 },
{ 1, 2, 41 },
{ 4, 5, 11 } });
System.out.println(earliestTime(arr, N));
}
}