#include <iostream>
#include <vector>
#include <cstdio>
#include <utility>
#include <algorithm>
using namespace std;
//看博友分析 抄博友程序 根只有一个儿子会跑重复的路 树上最长路径 dfs实现 bfs未实现 背
struct nod{
int to;
int len;
};
vector<nod> G[40008];
int jg;
int dfs(int u,int fa)
{
int max1=0;//最长路径
int max2=0;//次长路径
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i].to;
if(v!=fa)
{
max2=max(max2,dfs(v,u)+G[u][i].len);
if(max2>max1)
{
swap(max1,max2);
}
jg=max(jg,max1+max2);
}
}
return max1;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
//cout<<n<<" "<<m<<endl;
for(int i=0;i<m;i++)
{
int x,y,l;
char t;
char c;
//cin>>x>>y>>l>>c;
scanf("%d%d%d%c%c%c",&x,&y,&l,&t,&c,&t);
//cout<<x<<" "<<y<<" "<<l<<" "<<c<<endl;
G[x].push_back((nod){y,l});
G[y].push_back((nod){x,l});
}
dfs(1,0);
printf("%d\n",jg);
return 0;
}