// UVa10003 Cutting Sticks
// 算法:设d[i][j]为切割小木棍i~j的最优费用,则d[i][j]=min{d[i][k]+d[k][j]}+a[j]-a[i]。最后的a[j]-a[i]是第一刀的费用。然后分成i~k和k~j两部分。
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 50 + 5;
int n, L, a[maxn], vis[maxn][maxn], d[maxn][maxn];
/*int dp(int i, int j) {
if(i >= j - 1) return 0;
if(vis[i][j]) return d[i][j];
vis[i][j] = 1;
int& ans = d[i][j];
ans = -1;
for(int k = i+1; k <= j-1; k++) {
int v = dp(i,k) + dp(k,j) + a[j] - a[i];
if(ans < 0 || v < ans) ans = v;
}
return ans;
}*/
int dp[maxn][maxn];
void solve(int i,int j)
{
if(i == j-1)
dp[i][j] = 0;
else{
int ans = 1<<30,v;
for(int k = i+1; k <= j-1; k++) {
v = dp[i][k] + dp[k][j] + a[j] - a[i];
if(v <= ans)
ans = v;
}
dp[i][j] = ans;
}
}
int main() {
freopen("in.txt","r",stdin);
while(scanf("%d%d", &L, &n) == 2 && L) {
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
a[0] = 0; a[n+1] = L;
memset(vis, 0, sizeof(vis));
/* for(int i=0;i<=n+1;i++)
for(int j=i+1;j<=n+1;j++)
solve(i,j);
*/
for(int x=1;x<=n+1;x++)
for(int i=0;i<=n+1;i++){
int j=x+i;
solve(i,j);
}
/* for(int i=0;i<=n+1;i++){
for(int j=0;j<=n+1;j++)
printf("%d ",dp[i][j]);
printf("\n");
}
*/
printf("The minimum cutting is %d.\n", dp[0][n+1]);
}
return 0;
}