1. #include <cstdio>
    2. #include <algorithm>
    3. #include <cstring>
    4. #include <cstdlib>
    5. #include <vector>
    6. #include <iostream>
    7. using namespace std;
    8. inline int gi(){
    9. char tmp=getchar();int ans=0;
    10. while(!isdigit(tmp)) tmp=getchar();
    11. while(isdigit(tmp)){
    12. ans = ans * 10 + tmp - '0';
    13. tmp=getchar();
    14. }
    15. return ans;
    16. }
    17. const int N = 1e6;
    18. struct Node{
    19. int u,v;
    20. };
    21. vector<Node> V[N];
    22. int F[3][N];
    23. #define pb push_back
    24. signed main()
    25. {
    26. #ifdef TSUKIAKIOI
    27. freopen("data.in","r",stdin);
    28. #endif
    29. int n,m;
    30. n=gi(),m=gi();
    31. int maxx = 0;
    32. for(int i=1;i<=m;++i){
    33. int u,v,w;
    34. u=gi(),v=gi(),w=gi();
    35. V[w].pb(Node{u,v});
    36. maxx = max(maxx,w);
    37. }
    38. int ans = 0;
    39. int tot = 0;
    40. for(int i=1;i<=maxx+1;++i){
    41. int len = V[i].size();
    42. if(!len) continue;
    43. ++tot;
    44. for(int j=0;j<len;++j){
    45. int u = V[i][j].u;int v = V[i][j].v;
    46. F[1][0] = 1;
    47. }
    48. for(int j=0;j<len;++j){
    49. int u = V[i][j].u;int v = V[i][j].v;
    50. F[1][v] = max(F[1][v],F[0][u]+1);
    51. ans = max(ans,F[1][v]);
    52. }
    53. for(int j=0;j<len;++j){
    54. int u = V[i][j].u;int v = V[i][j].v;
    55. F[0][v] = F[1][v];
    56. }
    57. }
    58. printf("%d\n",ans);
    59. return 0;
    60. }