    #include <vector>
    #include <iostream>
    #include <iomanip>
    #include <queue>
    #include <stack>
    #include <set>
    
    using namespace std;
    
    struct Node
    {
        Node(int i, int p = -1):idx(i),prev(p){}
        int idx;   // Индекс
        int prev;  // Предыдущий узел - для восстановления пути
        bool operator <(const Node& n) const { return idx < n.idx; }
    };
    
    int main()
    {
        int start = 1, stop = 1;
    
        cin >> start;
    
        queue<Node> Q;   // Очередь BFS
        set<Node> S;     // Множество уже обработанных узлов
    
        Q.push(Node(start));
        while(!Q.empty())
        {
            S.insert(Q.front());        // Внесли в обработанные
            int index = Q.front().idx;  // Индекс
            if (index == stop) break;   // Найден!
            Q.pop();                    // Убираем из очереди
            vector<int> next;           // Возможные варианты
            if (index%3 == 0) next.push_back(index/3);
            if (index%2 == 0) next.push_back(index/2);
            if (index > 1) next.push_back(index-1);
            for(int i: next)            // Обработка возможных вариантов
            {
                Node n(i,index);
                if (S.find(n) != S.end()) continue;  // Уже отработан
                Q.push(n);              // Внесение в очередь еще не рассмотренных
            }
        }
    
        // Вывод цепочки - так как в обратном порядке, используем стек
    
        int last = Q.front().idx;
        auto i = S.find(Node(last));
    
        for(int index = i->prev; index != -1; )
        {
            if (index == last * 3) cout << 3; else
            if (index == last * 2) cout << 2; else cout << 1;
            last = index;
            i = S.find(Node(index));    // Поиск предыдущего
            if (i == S.end()) break;         // Береженого Бог бережет :)
            index = i->prev;                 // Предыдущий в цепочке
        }
    }