
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define rep(i,n) for(ll i=0;i<(ll)(n);i++)
#define all(a) (a).begin(),(a).end()
#define vi vector<int>
#define pb push_back
#define INF 999999999

//int upper(int dif,int m){
//	int ret = dif;
//	while(ret<=m)ret+=dif;
//	return ret;
//}
//
//int lower(int dif,int m){
//	int ret = dif;
//	while(ret<m)ret+=dif;
//	return ret;
//}
//
//int under(int dif,int m){
//	int ret=dif;
//	while(ret+dif<=m)ret+=dif;
//	return ret;
//}
//int n,m;
//
//bool isRef(int time,int dif,int ndif){
//	int ntime;
//	if(dif<=ndif)ntime = lower(ndif,time);
//	else		ntime = upper(ndif,time);
//	if(ntime>m)return false;
//	else return true;
//}
//
//int main(){
//	while(cin>>n>>m){
//		vector<pair<pii,int>> vec;
//		int ans=-1;
//		if(n==0&&m==0)break;
//		vector<int> v(n);
//		rep(i,n)cin>>v[i];
//		
//		int pos = -1, time = INF, dif = INF;
//		for(int i=0;i<n;i++){
//			if(i==0 || isRef( time,dif,v[i] )){
//				pos = i+1;
//				time = under(v[i],m);
//				dif = v[i];
//				vec.pb(make_pair(pii(time,dif),pos));
//			}
//			else{
//				int ntime;
//				if(dif<=v[i])ntime = lower(v[i],time);
//				else		ntime = upper(v[i],time);
//				if(ntime>m){ans = i+1;break;}
//				vec.pb(make_pair(pii(ntime,v[i]),pos));
//			}
//		}
//		rep(i,vec.size())cout<<vec[i].first.first<<" "<<vec[i].first.second<<" "<<vec[i].second<<endl;
//		if(ans!=-1)cout<<ans<<endl;
//		else{
//			sort(all(vec));
//			if(vec[0].first==vec[1].first)cout<<n<<endl;
//			else cout<<vec[0].second+1<<endl;
//		}
//	}
//}



//int main(){
//	int n, m, p, result = 0;
//	int field[10] = {0};
//	
//	cin >> n >> m;
//	
//	for(int i=0; i < m; i++){
//		cin >> p;
//		int q = max(field[p]+1,field[p+1]+1);
//		field[p]=q; field[p+1]=q;
//		result = max(result, q);
//	}
//	cout << result << endl;
//}

int result[10];

int solve(vector<int> field){
	int r[10];
	for(int i=0; i < 10; i++) r[i] = i;
	
	for(int i=0; i < field.size(); i++){
		swap(r[field[i]], r[field[i]+1]);
	}
	
	bool ok = true;
	for(int i=0; i < 10; i++) if(r[i] != result[i]){ ok = false; break;}
	if(! ok) return 100000;
	
	
	
	bool f[15][15];
	for(int i=0; i < 15; i++) for(int j=0; j < 15; j++) f[i][j] = false;
	
	for(int i=0; i < field.size(); i++){
		f[i+1][field[i]] = true;
	}
	
	
	bool change = false;
	while(1){
		change = false;
		for(int i=1; i < 10; i++){
			for(int j=1; j < 10; j++){
				if(!f[i][j] || i == 1) continue;
				bool ok = true;
				for(int k=-1; k <= 1; k++){
					if(f[i-1][j+k] == 1){ok = false;}
				}
				if(ok){change = true; f[i][j] = false; f[i-1][j] = true;}
				
			}
			
		}
		if(!change) break;
	}
	int ans = 0;
	
	for(int i=0; i < 10; i++){
		for(int j=0; j < 10; j++){
			if(f[i][j]) ans = max(ans, i);
		}
	}
	return ans;
}

int main(){
	int n, m;
	vector<int> field;
	
	cin >> n >> m;
	
	int p;

	for(int i=0; i < 10; i++) result[i] = i;
	for(int i=0; i < m; i++){
		cin >> p;
		field.push_back(p);
		swap(result[p], result[p+1]);
	}
	sort(field.begin(), field.end());
	
	int ans = 100000;
	
	do{
		ans = min(ans, solve(field));
	}while(next_permutation(field.begin(), field.end()));
	
	cout << ans << endl;
}