import java.util.Scanner;

public class Main {
	private static int m;
	private static int n;
	private static int[] a;
	private static int[] b;
	private static int[] c;
	
	private static int baloonsByIthPersonInXMinutes(int i, int x) {
		int fullCycleTime = a[i] * b[i] + c[i];
		int fullCyclesCount = x / fullCycleTime;
		int remainingTime = x - fullCyclesCount*fullCycleTime;
		int balloonsInRemainingTime = Math.min(b[i], remainingTime / a[i]);
		return fullCyclesCount * b[i] + balloonsInRemainingTime;
	}
	
	private static int totalBaloonsInXMinutes(int x) {
		int result = 0;
		for (int i = 0; i < n; ++i) {
			result += baloonsByIthPersonInXMinutes(i, x);
		}
		return result;
	}
	
	private static int findUpperBound() {
		int result = 1;
		while (totalBaloonsInXMinutes(result) < m) {
			result *= 2;
		}
		return result;
	}
	
	private static int solveByBinarySearch(int lowerBound, int upperBound) {
		if (lowerBound == upperBound) return lowerBound;
		int middle = (lowerBound + upperBound) / 2;
		int middleValue = totalBaloonsInXMinutes(middle);
		if (middleValue < m)
			return solveByBinarySearch(middle + 1, upperBound);
		else
			return solveByBinarySearch(lowerBound, middle);

	}
	
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        m = in.nextInt();
        n = in.nextInt();
        a = new int[n];
        b = new int[n];
        c = new int[n];
        for(int i = 0; i < n; i++) {
            a[i] = in.nextInt();
            b[i] = in.nextInt();
            c[i] = in.nextInt();
        }
		int upperBound = findUpperBound();
		int result = solveByBinarySearch(upperBound / 2, upperBound);
        System.out.println(result);
    }
}