#include <bits/stdc++.h>
using namespace std;
int N, M;
set<pair<int, int> > dp[1000001];
int ans = 0;
void insert(int from, int to, int w) {
  pair<int, int> toinsert;
  toinsert.first = w;
  toinsert.second = 0;
  set<pair<int, int> >::iterator it = dp[from].lower_bound(toinsert);
  if (it == dp[from].begin())
    toinsert.second = 1;
  else {
    --it;
    toinsert.second = it->second + 1;
  }
  it = dp[to].lower_bound(toinsert);
  if (it != dp[to].begin()) {
    --it;
    if (it->second >= toinsert.second) return;
    ++it;
  }
  while (it != dp[to].end()) {
    if (it->second > toinsert.second) break;
    dp[to].erase(it++);
  }
  dp[to].insert(toinsert);
  ans = max(ans, toinsert.second);
}
int main() {
  std::ios_base::sync_with_stdio(false);
  scanf("%d %d", &N, &M);
  for (int i = 0; i < M; i++) {
    int a, b, w;
    scanf("%d %d %d", &a, &b, &w);
    insert(a, b, w);
  }
  printf("%d\n", ans);
  return 0;
}
