#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include <vector>
#include <set>
#include <map>
#include <unordered_map>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cstdlib>
#include <algorithm>
#include <list>
#include <string>
#include <cmath>
#include <bitset>
#include <stack>
#include <unordered_set>
#define ull unsigned long long
#define ll long long
#define pii pair<ll ,ll>
#define ft first
#define sd second
#define pr pair
#define cy cout<<"Yes"<<endl
#define cn cout<<"No"<<endl
#define forn(i,n) for(int (i)=0;(i)<(n);(i)++)
#define forne(i,n) for(int (i)=1;(i)<=(n);(i)++)
#define rforn(i,n) for(int (i)=(n-1);(i)>=(0);(i)--)
#define rforne(i,n) for(int (i)=(n);(i)>=(1);(i)--)
#define vv vector
const int inf = 0x004f4f4f;
const int N = 5e5 + 10;
struct edge {
int next, to, w;
};
vv<vv<pii>>tree;
vv<vv<edge>>e;
ll t;
void solve() {
int n, m; cin >> n >> m;
vv<pii>nums(m);
vv<int>tm(m);
for(int i=0;i<m;i++)
cin >> tm[i] >> nums[i].ft>>nums[i].sd;
vv<int>f(m);
for(int i=0;i<m;i++) {
f[i]=1;
for(int j=0;j<i;j++) {
if (abs(nums[i].ft - nums[j].ft)
+ abs(nums[i].sd - nums[j].sd)
<= tm[i] - tm[j])
f[i] = max(f[i], f[j] + 1);
}
}
int mx = 1;
for(int i=0;i<m;i++)
mx = max(mx, f[i]);
cout << mx << endl;
}
int main() {
t = 1;
while (t--)
solve();
return 0;
}