#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct node{
int to,next,w;
}e[maxn*20];
int dp[maxn];//设dp[x]表示从节点x出发,往以x为根的子树走,能够到达的最远距离
int head[maxn],fa[maxn];
int fff=0;
void add(int u,int v,int w){
e[fff]=node{v,head[u],w};
head[u]=fff++;
}
int check(int x){
return fa[x]==x?x:fa[x]=check(fa[x]);
}
int ans=0;
int dfs(int now,int far)
{
int tnex = 0;
for(int i = head[now]; ~i; i = e[i].next)
{
int v = e[i].to;
if(v == far)
continue;
int re = dfs(v,now);
ans = max(ans,tnex+re +e[i].w);
tnex = max(tnex,re + e[i].w);
}
return dp[now] = tnex;
}
//void dfs(int u,int pre){
// for(int i=head[u];~i;i=e[i].next){
// int v=e[i].to;int w=e[i].w;
// if(v==pre)continue;
// dfs(v,u);
// ans=max(ans,dp[v]+dp[u]+w);
// dp[u]=max(dp[u],dp[v]+w);
// }
//}
//void dfs(int u, int pre) {
// for (int i = head[u]; ~i; i = e[i].next) {
// int v = e[i].to;
// if (v == pre) continue;
// dfs(v, u);
// ans = max(ans, dp[u] + dp[v] + e[i].w);
cout<<u<<" "<<v<<" "<<ans<<endl;
// dp[u] = max(dp[u], dp[v] + e[i].w);
// }
//}
int n,m;
void solve(){
for(int i=1;i<=n;i++){
if(dp[i]==-1){
dfs(i,-1);
}
}
printf("%d\n",ans);
}
int combin(int u,int v){
int fu,fv;
fu=check(u);
fv=check(v);
if(fu!=fv){
fa[fu]=fv;return 0;
}
else{
return 1;
}
}
int main(){
while(~scanf("%d%d",&n,&m)){
int flag=0;fff=0;ans=0;
for(int i=1;i<=n;i++){
fa[i]=i;dp[i]=-1;head[i]=-1;
}
for(int i=1;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);add(v,u,w);
// cout<<"asdasd"<<endl;
// if(flag)continue;
int tag=combin(u,v);
if(tag)flag=1;
}
if(flag){
printf("YES\n");
// puts("YES");
}
else{
solve();
}
}
return 0;
}