import std.algorithm;
import std.array;
import std.conv;
import std.math;
import std.range;
import std.stdio;
import std.string;
import std.typecons;

void scan(T...)(ref T a) {
    string[] ss = readln.split;
    foreach (i, t; T) a[i] = ss[i].to!t;
}
T read(T)() { return readln.chomp.to!T; }
T[] reads(T)() { return readln.split.to!(T[]); }
alias readint = read!int;
alias readints = reads!int;

void calc(int n, int[] a) {
    auto costs = [0, 2, 5, 5, 4, 5, 6, 3, 7, 6];

    auto dp = new int[n + 1];
    foreach (e; a) {
        int cost = costs[e]; // 数字 e に必要な本数
        if (cost > n) continue;

        dp[cost] = max(dp[cost], 1);
        for (int i = 1; i <= n - cost; i++) {
            if (dp[i] == 0) continue;
            dp[i + cost] = max(dp[i + cost], dp[i] + 1);
        }
    }

    // 桁の大きなマッチ棒から試す
    a.sort!"a > b";
    int[] ans;
    int rest = n;
    foreach (e; a) {
        // 数字 e を作るのに必要な本数
        int cost = costs[e];

        // 数字 e を作成しても最適解を維持しているか
        while (cost <= rest && dp[rest - cost] == dp[rest] - 1) {
            if (dp[rest - cost] == 0 && rest - cost > 0) break; // マッチ棒を余すのはだめ
            ans ~= e;
            rest -= cost;
        }
    }

    writeln(ans.map!(text).join);
}

void main() {
    int n, m; scan(n, m);
    auto a = readints;
    calc(n, a);
}
