#include <iostream>#include <string>#include <cstring>#include <algorithm>#include <cstdio>#define maxn 100010#pragma comment(linker, "/STACK:36777216")using namespace std;struct Edge{ int to,len; int next;} edges[2000010];int N,M;int cnt;int head[maxn];bool vis[maxn];void addedge(int u,int v,int w){ edges[cnt].to=v,edges[cnt].len=w,edges[cnt].next=head[u],head[u]=cnt++;}int kid[maxn];int dp[maxn][2];int ans;bool dfs(int u,int fa){ vis[u]=true; int i,j; for(i=head[u]; i!=-1; i=edges[i].next) { Edge& e=edges[i]; if(e.to==fa) continue; if(vis[e.to]) { return true; } if(dfs(e.to,u)) { return true; } } return false;}void dfs1(int u,int fa){ vis[u]=true; int i,j; dp[u][1]=dp[u][0]=0; for(i=head[u]; i!=-1; i=edges[i].next) { Edge& e=edges[i]; if(e.to==fa) continue; dfs1(e.to,u); if(dp[e.to][0]+e.len>dp[u][0]) { dp[u][1]=dp[u][0]; dp[u][0]=dp[e.to][0]+e.len; kid[u]=e.to; } else if(dp[e.to][0]+e.len>dp[u][1]) { dp[u][1]=dp[e.to][0]+e.len; } }}void dfs2(int root,int fa){ int i,j; for(i=head[root]; i!=-1; i=edges[i].next) { Edge& e=edges[i]; if(e.to==fa) continue; if(e.to!=kid[root]) { if(dp[root][0]+e.len>dp[e.to][0]) { dp[e.to][1]=dp[e.to][0]; dp[e.to][0]=dp[root][0]+e.len; kid[e.to]=root; } else if(dp[root][0]+e.len>dp[e.to][1]) { dp[e.to][1]=dp[root][0]+e.len; } } else { if(dp[root][1]+e.len>dp[e.to][0]) { dp[e.to][1]=dp[e.to][0]; dp[e.to][0]=dp[root][1]+e.len; kid[e.to]=root; } else if(dp[root][1]+e.len>dp[e.to][1]) { dp[e.to][1]=dp[root][1]+e.len; } } dfs2(e.to,root); ans=max(ans,dp[e.to][0]); }}int main(){ // freopen("input.txt","r",stdin); int i,j; while(scanf("%d %d",&N,&M)==2) { cnt=0; memset(head,-1,sizeof(head)); for(i=0; i<M; i++) { int x,y,z; scanf("%d %d %d",&x,&y,&z); addedge(x,y,z); addedge(y,x,z); } for(i=1;i<=N;i++) { vis[i]=0; } for(i=1; i<=N; i++) { if(vis[i]) continue; if(dfs(i,-1)) { puts("YES"); break; } } if(i!=N+1) { continue; } for(i=1;i<=N;i++) { vis[i]=0; } ans=0; for(i=1; i<=N; i++) { if(vis[i]) continue; dfs1(i,-1); ans=max(ans,dp[i][0]); dfs2(i,-1); } printf("%d\n",ans); } return 0;}