#include <iostream>  // cin,cout
#include <stdio.h>   // printf,scanf (standard input/output)
#include <cmath>     // abs(x),pow(x,2)
#include <string>
#include <string.h>  // strlen, strcmp
#include <algorithm> // min,max, sort(v.begin(),v.end())
#include <vector>
#include <time.h>
using namespace std;


struct Data{
    vector<int> x{};
};

int main(){
    int N, M;
    int A[10];
    int input[10] = {0,2,5,5,4,5,6,3,7,6};
    //cout << input[1] << endl;
    vector<int> v{};
    int correspond[10] = {0,0,1,7,4,2,6,8,0,0};
    Data DP[10001];
    
    cin >> N >> M;
    for (int i=0;i<M;i++) cin >> A[i];
    
    // マッチ本数のリスト作成
    for (int i=0;i<M;i++) v.push_back(input[A[i]]);
    sort(v.begin(),v.end());
    v.erase(unique(v.begin(), v.end()), v.end());
    for (int i=0;i<v.size();i++) {
        if (v[0]==2) {
            replace(v.begin(), v.end(), 4, 2);
            replace(v.begin(), v.end(), 6, 2);
        }
        if (v[0]==3) {
            replace(v.begin(), v.end(), 6, 3);
        }
    }
    sort(v.begin(),v.end());
    v.erase(unique(v.begin(), v.end()), v.end());
//    for (int i=0;i<v.size();i++) cout << v[i] << " ";
//    cout << endl;
    
    // マッチ本数:作れる最大数字の対応リスト作成
    for (int i=0;i<M;i++) {
        if (A[i]==9) correspond[6] = 9;
        if (A[i]==5) correspond[5] = 5;
        if (A[i]==3) correspond[5] = max(3,correspond[5]);
    }
//    for (int i=0;i<10;i++) cout << correspond[i] << " ";
//    cout << endl;
    
    
    int match[10001];
    for (int i=0;i<=10000;i++) match[i] = -1;
    
    int size = v.size();
    for (int i=2;i<=N;i++) {
        // 最大桁数求める
        for (int j=0;j<size;j++) {
            int target = i - v[j];
            if(target>=0 and match[target]!=-1) match[i] = max(match[i],match[target]+1);
            else if (i==v[j]) match[i] = max(1,match[i]); // {2,3,4,5,6,7}
        }
//        cout << i << ": " << match[i];
        
        // 最大作成整数列を求めて次に繋げる
        if (match[i]==1) DP[i].x.push_back(correspond[i]);
        else {
            // 最大整数列 max_vv
            vector<int> max_vv{};
            for (int k=0;k<match[i];k++) max_vv.push_back(0);
            
            // 整数列 vv
            for (int j=0;j<size;j++) {
                int target = i - v[j];
                vector<int> vv{};
                if(target>=0 and match[target]!=-1) if (match[target]+1==match[i]) {
                    for (int k=0;k<DP[target].x.size();k++) vv.push_back(DP[target].x[k]);
                    vv.push_back(correspond[v[j]]);
                    sort(vv.begin(), vv.end(), greater<int>());
                    
                    // vvとmax_vvを比較
                    for (int j=0;j<match[i];j++) {
                        if (vv[j]!=max_vv[j]) {
                            if (vv[j]>max_vv[j]) for (int k=0;k<match[i];k++) max_vv[k] = vv[k];
                            break;
                        }
                    }
                }
            }
            // max_vvをDPに保持
            for (int j=0;j<max_vv.size();j++) DP[i].x.push_back(max_vv[j]);
        }
//        cout << ", DP:[";
//        for (int j=0;j<DP[i].x.size();j++) cout << DP[i].x[j] << " ";
//        cout << "]" << endl;
    }
    
    for (int j=0;j<DP[N].x.size();j++) cout << DP[N].x[j];
    cout << endl;
    
    
    return 0;
}


Measured memory_bytes: 123264