#include<bits/stdc++.h>
using namespace std;
long long n,m;
vector<pair<long long,long long>> org[1000050];
long long dtot = 0,stot = 0,low[1000050],dfn[1000050];
long long belong[1000050];
stack<long long> que;
bitset<1000050> inque;
void tarjan(long long now,long long fa){
dfn[now] = low[now] = ++dtot;
que.push(now);
inque[now] = 1;
bool visfa = 0;
for(auto i:org[now]){
if(!inque[i.first]){
tarjan(i.first,now);
low[now] = min(low[now],low[i.first]);
}else if(dfn[i.first]){
if(i.first != fa || visfa){
low[now] = min(low[now],dfn[i.first]);
}else{
visfa = 1;
}
}
}
if(low[now] == dfn[now]){
long long y;
stot++;
do{
y = que.top();
que.pop();
inque[y] = 0;
belong[y] = stot;
}while(y != now);
}
return;
}
struct edges{
long long Start,End,Len;
}edge[4000050];
long long etot = 0;
long long Last[1000050],Next[4000050],End[4000050];
unordered_set<long long> s;
void addedge(long long u,long long v,long long c){
if(s.count(belong[u]*1000050ll+belong[v])){
return;
}
// printf("%lld %lld %lld\n",u,v,c);
etot++;
edge[etot].Start = u;
edge[etot].End = v;
edge[etot].Len = c;
Next[etot] = Last[u];
Last[u] = etot;
End[etot] = v;
s.insert(belong[u]*1000050ll+belong[v]);
return;
}
long long color[1000050],l = 0,r = 0;
long long dfs(long long now,long long fa){
if(now == l){
return 1;
}
if(now == r){
return 2;
}
if(color[now]){
return 0;
}
for(long long i = Last[now]; i; i = Next[i]){
if(End[i] == fa){
continue;
}
static long long tp;
tp = dfs(End[i],now);
if(tp){
color[now] = 1;
return tp;
}
}
return 0;
}
int main(){
scanf("%lld%lld",&n,&m);
while(m--){
static long long tpa,tpb,tpc;
scanf("%lld%lld%lld",&tpa,&tpb,&tpc);
org[tpa].push_back({tpb,tpc});
org[tpb].push_back({tpa,tpc});
}
for(long long i = 1; i <= n; i++){
if(!dfn[i]){
tarjan(i,0);
}
}
if(stot == 1){
puts("-1");
return 0;
}
for(long long i = 1; i <= n; i++){
for(auto j:org[i]){
addedge(belong[i],belong[j.first],j.second);
}
}
sort(edge+1,edge+1+etot,[](edges x,edges y) -> bool{return x.Len < y.Len;});
l = edge[1].Start;
r = edge[1].End;
color[edge[1].Start] = color[edge[1].End] = 1;
for(long long i = 2; i <= etot; i++){
static long long tp;
if(color[edge[i].Start]){
continue;
}
tp = dfs(edge[i].Start,-114);
if(tp == 0){
printf("%lld",edge[i].Len);
return 0;
}
if(tp == 1){
l = edge[i].Start;
}else{
r = edge[i].Start;
}
color[edge[i].Start] = 1;
}
puts("-1");
return 0;
}
如果哪里没看懂可以问,在线等。
回复时记得 @ 我,不然我可能注意不到。