// 经典的动态规划, 0-1背包题目, 下面是最重要的三个分析 (未优化版本, 更好理解, 直接套模板): 
// dp[i][j] 表示i个草药, j的总时间, 能采到的草药的最大总价值

// 状态转移方程: 
// 当j-w[i] >= 0时, dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]);
// 否则, dp[i][j] = dp[i-1][j];

// 边界条件: dp[i][0] = 0, dp[0][j] = 0, (0 <= i <= m, 0 <= j <= t)

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

const int MAXT = 1001;
const int MAXM = 101;

int dp[MAXM][MAXT];
int w[MAXM];
int v[MAXM];

int main() {
    int t, m;
    while (scanf("%d%d", &t, &m) != EOF) {
        // 初始化
        memset(dp, 0, sizeof(dp));        
        for (int i = 1; i <= m; i++) {
            scanf("%d%d", &w[i], &v[i]);
        }

        // 动态规划
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= t; j++) {
                if (j >= w[i]) {
                    dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]);
                } else {
                    dp[i][j] = dp[i-1][j];
                }
            }
        }
        printf("%d\n", dp[m][t]);
    }
    return 0;
}