#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
long long powmod(long long a, long long b, long long MOD) {
  long long ans = 1;
  while (b) {
    if (b % 2) ans = ans * a % MOD;
    a = a * a % MOD;
    b /= 2;
  }
  return ans;
}
const int N = 3e5 + 11;
int n, m;
struct uzi {
  int s, t, w;
  bool operator<(const uzi& t) const { return w < t.w; }
} p[N];
int a[N], b[N];
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> m;
  for (int i = 1; i <= m; i++) cin >> p[i].s >> p[i].t >> p[i].w;
  sort(p + 1, p + 1 + m);
  for (int i = 1; i <= m; i++) {
    int j = i + 1;
    while (j <= m && p[j].w == p[i].w) j++;
    queue<int> q;
    for (int k = i; k < j; k++) {
      b[p[k].t] = max(b[p[k].t], a[p[k].s] + 1);
      q.push(p[k].t);
    }
    while (!q.empty()) {
      int now = q.front();
      a[now] = max(a[now], b[now]);
      b[now] = 0;
      q.pop();
    }
    i = j - 1;
  }
  cout << *max_element(a + 1, a + 1 + n) << endl;
  return 0;
}
