#include <bits/stdc++.h>
using namespace std;
long long max_weights(int N, int M, vector<int>X, vector<int>Y, vector<int>W){
bool st1 = true;
for(int i = 0; i < M; i++) st1 &= (X[i]%2==0);
bool st2 = true;
for(int i = 0; i < M; i++) st2 &= (X[i]<=1);
bool st3 = true;
for(int i = 0; i < M; i++) st3 &= (Y[i]==0);
if (st1){
long long ans = 0;
for(int i = 0; i < M; i++){
ans += W[i];
}
return ans;
}
if (st2){
long long ans = 0, c = 0, e = 0, o = 0;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>>E, O;
for(int i = 0; i < M; i++){
if (X[i] == 0) E.push(make_pair(Y[i], i)), e += W[i];
else O.push(make_pair(Y[i], i)), ans += W[i], c += W[i], o += W[i];
}
if (N == 2) return max(e, o);
while (!E.empty()){
pair<int, int> t = E.top();
c += W[t.second];
while (!O.empty() && (O.top().first) <= t.first){
c -= W[O.top().second];
O.pop();
}
E.pop();
ans = max(ans, c);
}
return ans;
}
if (st3){
long long A[M] = {0};
A[0] = W[0];
A[1] = W[1];
for(int i = 2; i < M; i++){
A[i] = max(A[i-2] + W[i], A[i-1]);
}
return max(A[M-1], A[M-2]);
}
}
int main(){
int N, M;
cin >> N >> M;
vector<int>X(M, 0), Y(M, 0), W(M, 0);
for(int i = 0; i < M; i++){
cin >> X[i] >> Y[i] >> W[i];
}
cout << max_weights(N, M, X, Y, W);
}