#include<cstdio>
#include<iostream>
#include<vector>
#include<string>
#include<deque>
#include<map>
#include<algorithm>

using namespace std;

int n,m;
int hon[100];
//3 9 5 3 8 2 1 6 9 7 4

int doteki(){
	int d[101][30];
	int p[101];
	p[0]=hon[0];
	for(int i=0;i<m;i++){
		for(int j=0;j<m;j++){
			d[i][j]=1<<29;
		}
	}
	for(int i=1;i<m;i++){
		p[i]=p[i-1]+hon[i];
	}
	for(int i=0;i<n;i++){
		d[0][i]=p[0];
	}
	for(int i=0;i<m;i++){
		d[i][0]=p[i];
	}
	for(int i=1;i<m;i++){
		for(int j=1;j<n;j++){
			for(int k=0;k<i;k++){
				d[i][j]=min(max(d[k][j-1],p[i]-p[k]),d[i][j]);
			}
		}
	}
	return d[m-1][n-1];
}
int nibun(){
	int R,L;R=L=0;
	if(n>=m){
		return *max_element(hon,hon+n);
	}
	for(int i=0;i<m;i++){
		L+=hon[i];
	}
	while(1){
		if(R==L){
			return R;
		}
		double H=(double)(R+L)/2;
		
		int dan=0;
		int at=0;
		for(int i=0;i<m;i++){
			if(at+hon[i] <= H){
				at+=hon[i];
			}else{
				at=0;
				dan++;
				at+=hon[i];
			}
		}
		
		if(dan<n){
			L=H;
		}else{
			R=H+0.5;
		}
		
	}
}

int main(){
	
	//3 9 5 3 8 2 1 6 9 7 4
	while(1){
		scanf("%d%d",&n,&m);
		if(n==0&&m==0){
			break;
		}
		for(int i=0;i<m;i++){
			scanf("%d",&hon[i]);
		}
		
		printf("%d\n",doteki());
	}
}