vector<string> restoreIpAddresses(string s)
 {
     vector<string> res;
     vector<string> ip;
     back_tracking(s,0,ip,res,3);
     return res;
 }
void back_tracking(int depth, int sum) {

	if (depth > n) {

		if (max < sum) {
			max = sum;
		}
		return;
	}

	if (sum > limit) {

		return;
	}

	if (max < sum) {
		max = sum;
	}

	for (int i = 0; i<n; i++) {
		if (visited[i] == 0) {
			visited[i] = 1;
			back_tracking(depth + 1, sum + foods[i]);
			printf("depth:%d,sum:%d\n", depth + 1, sum + foods[i]);
			visited[i] = 0;
		}
	}




}
int main() {

	int j;
	scanf("%d %d", &cal, &num);

	for (j = 0; j<num; j++) {
		scanf("%d", &basket[j]);
	}

	back_tracking(0);//sum 0으로 시작

	printf("%d\n", max);//최대 칼로리출력


	return 0;
}
int main() {


	scanf("%d %d", &limit, &n);

	for (int i = 0; i<n; i++) {
		scanf("%d", &foods[i]);
	}

	back_tracking(0, 0);

	printf("%d\n", max);


	return 0;
}
void back_tracking(int sum) {
	int i;

	if (sum > cal)//sum이 최대 칼로리보다 큰 경우
		return;
	if (sum <= cal && max < sum) {//sum이 최대 칼로리보다 작고 max보다 큰경우
		max = sum;
	}

	for (i = 0; i<num; i++) {
		if (visited[i] == 0) {//더한 수를 또 더하지 않도록! 중복방지
			visited[i] = 1;
			back_tracking(sum + basket[i]);
			visited[i] = 0;
		}
		
	}
}
 void back_tracking(string &s,int prev_pos,vector<string> &ip,vector<string> &res,int dot_left)
 {
     if(ip.size()==4)
     {
         res.push_back(ip[0]+"."+ip[1]+"."+ip[2]+"."+ip[3]);
         return;
     }
     for(int i=prev_pos+1;i<=prev_pos+3;++i)
     {
         string seg=string(s.begin()+prev_pos,s.begin()+i);
         int length=s.size()-prev_pos;
         if(atoll(seg.c_str())>255||
             length>3*(dot_left)||
             length<dot_left||
             (seg.front()=='0'&&seg.size()>1)) return;
         //if(isValid(seg,i,s,dot_left-1))
         //{
             ip.push_back(seg);
             back_tracking(s,i,ip,res,dot_left-1);
             ip.pop_back();
         //}
     }
 }