#include <algorithm>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <cassert>
#include <iostream>
#include <map>
#include <queue>
#include <sstream>
#include <string>
#include <stack>
#include <set>
#include <vector>

using namespace std;

#define all(c) ((c).begin()), ((c).end())
#define dump(c) cerr << "> " << #c << " = " << (c) << endl;
#define iter(c) __typeof((c).begin())
#define tr(i, c) for (iter(c) i = (c).begin(); i != (c).end(); i++)
#define REP(i, a, b) for (int i = a; i < (int)(b); i++)
#define rep(i, n) REP(i, 0, n)
#define mp make_pair
#define fst first
#define snd second
#define pb push_back

typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<double> vd;
typedef vector<vd> vvd;
typedef vector<string> vs;
typedef pair<int,int> pii;

const int INF = 1 << 29;
const double EPS = 1e-10;

template<typename T1,typename T2>
ostream& operator<<(ostream& os,const pair<T1,T2>& p){
    return os<<'('<<p.first<<','<<p.second<<')';
}
template<typename T>
ostream& operator<<(ostream& os,const vector<T>& a){
    os<<'[';
    rep(i,a.size()) os<<(i?" ":"")<<a[i];
    return os<<']';
}



int main() {
    for (int m, n; cin >> m >> n, (m | n) != 0;) {
        int bs[100];
        rep(i, n) cin >> bs[i];

        int lb = 0, ub = 1500001;
        while (ub - lb > 1) {
            int mid = (ub + lb) / 2;
            int c = 1;
            int l = 0;
            bool suc = true;
            rep(i, n) {
                if (l + bs[i] > mid) {
                    if (c == m || bs[i] > mid) {
                        suc = false;
                        break;
                    }
                    c++;
                    l = bs[i];
                }
                else {
                    l += bs[i];
                }
            }
            if (suc) ub = mid;
            else lb = mid;
        }
        cout << ub << endl;
    }
    return 0;
}