Edge Reverse
Contest: Codeforces Round 845 (Div. 2) and ByteRace 2023
Difficulty rating: 2200
Tags: binary search, dfs and similar, graphs, trees

You will be given a weighted directed graph of $$$n$$$ nodes and $$$m$$$ directed edges, where the $$$i$$$-th edge has a weight of $$$w_i$$$ ($$$1 \le i \le m$$$).

You need to reverse some edges of this graph so that there is at least one node in the graph from which every other node is reachable. The cost of these reversals is equal to the maximum weight of all reversed edges. If no edge reversal is required, assume the cost to be $$$0$$$.

It is guaranteed that no self-loop or duplicate edge exists.

Find the minimum cost required for completing the task. If there is no solution, print a single integer $$$-1$$$.

Input format:
Each test contains multiple test cases. The first line contains the number of test cases $$$t$$$ ($$$1 \le t \le 10^5$$$). The description of the test cases follows.

Each test case begins with a line containing two integers $$$n$$$ and $$$m$$$ ($$$2 \le n \le 2 \cdot 10^5$$$, $$$1 \le m \le 2 \cdot 10^5$$$) — the number of nodes in the graph and the number of edges in the graph.

The next $$$m$$$ lines of each test case contain $$$3$$$ integers each — $$$u$$$, $$$v$$$, $$$w$$$ ($$$1 \le u, v \le n$$$, $$$1 \le w \le 10^9$$$), indicating an edge from $$$u$$$ to $$$v$$$ with a weight of $$$w$$$. It is guaranteed that no edge connects a vertex to itself, and no pair of edges share the same origin and destination simultaneously.

It is guaranteed that the sum of $$$n$$$ and the sum of $$$m$$$ over all test cases do not exceed $$$2 \cdot 10^5$$$.

Output format:
For each test case, output the minimum cost. If there is no solution, print $$$-1$$$.

Constraints:
Time limit: 4.0 s
Memory limit: 512.0 MB

Note:
In the first test case, an edge exists from $$$1$$$ to $$$2$$$, so all nodes are reachable (from $$$1$$$).

In the second test case, no nodes are reachable from any node no matter what edges we reverse, so the answer is $$$-1$$$.

In the third test case, reversing the $$$4$$$-th or $$$5$$$-th edge allows all nodes to be reachable from $$$1$$$. We choose the $$$5$$$-th edge here because its weight is smaller.

Example input:
4
2 1
1 2 3
5 4
1 2 10
2 3 10
3 1 10
4 5 10
4 5
1 2 10000
2 3 20000
1 3 30000
4 2 500
4 3 20
4 5
1 2 10000
2 3 20000
1 3 30000
4 2 5
4 3 20

Example output:
0
-1
20
5

Editorial:
If the cost for completing the task is $$$c$$$, we can reverse any edge with cost $$$\le c$$$. This is equivalent to making those edges bidirectional since when checking for reachability, we only need to traverse an edge once, and we can choose to reverse it or not, depending upon the need.
We can apply a binary search on the minimum cost and check if there exists at least one node such that all nodes are reachable from it if all edges with cost less than or equal to the current cost become bidirectional.
To check in linear time if there exists such a suitable node, we will use a suppressed version of the Kosa Raju algorithm. We condense the nodes into Strongly Connected Components (SCCs) and perform a topological sort on them. If there exists an SCC from which all SCCs are reachable, then the first element in the topological sort will be that SCC (since in a topological sort, an element can only reach elements coming after it). So, we can choose any node from the first SCC in the topological sort and apply DFS to check if all the nodes are reachable from that node. If they aren't, we conclude it is impossible to complete the task with the current cost.
Overall time complexity: $$$O((N+M) \cdot \log C)$$$