#include <bits/stdc++.h>
using namespace std;
int n, m, dp[300300], ans;
vector<int> vv;
struct edge {
  int u, v, w;
} e[300300];
bool cmp(edge e1, edge e2) { return e1.w < e2.w; }
int main() {
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    cin >> e[i].u >> e[i].v >> e[i].w;
  }
  sort(e, e + m, cmp);
  for (int i = 0; i < m;) {
    int j = i;
    for (; j < m; j++) {
      if (e[j].w != e[i].w) break;
      vv.push_back(max(dp[e[j].v], dp[e[j].u] + 1));
    }
    int tempi = i;
    for (; i < j; i++) dp[e[i].v] = max(dp[e[i].v], vv[i - tempi]);
    vv.clear();
  }
  for (int i = 1; i <= n; i++) ans = max(ans, dp[i]);
  cout << ans;
  return 0;
}
