#include <iostream>
#include <vector>
using namespace std;

void ToPrint(int n, int m, int *currentNumberColumn, int *currentNumberRow, int symbolToPrint) {
	(*currentNumberColumn)++; // Инкрементируем значение номера столбца, так как есть символ на печать
	if (*currentNumberColumn > n) {
		cout << endl; // Переходим на новую строку
	  	(*currentNumberRow)++;
	  	*currentNumberColumn = 1; 
	} // Если следует выполнить переход на следующую строку, выполняем этот переход по всем индексам
	if (*currentNumberRow > m)
	    exit(0); // Заканчиваем работу программы, как только количество строк превышает заданное
	else if (symbolToPrint == 32 && *currentNumberColumn == 1) // В таблице ASCII 32 - пробел
	    (*currentNumberColumn)--; // Возвращаем предыдущее значение номера столбца, так как ничего не было напечатано
    else if (symbolToPrint == 32)
        cout << char(symbolToPrint); // Выводим пробел, если это не начало строки
    else
      	cout << symbolToPrint;
}

int main() {
	int n, m; // Количество столбцов и строк соответственно
	cin >> n >> m;
	int start = 0; // Индекс элемента текущей цифры с которой ведется сравнение
    int quantity = 0; // Количество идущих подряд одинаковых элементов в данном члене
    int currentNumberRow = 1; // Номер текущей строки, в которой будет записан символ
    int currentNumberColumn = 0; // Номер текущего столбца, в который будет записан символ
    vector <short> currentTerm; // Вектор, хранящий значение текущего члена последовательности
    vector <short> previousTerm; // Вектор, хранящий значение предыдущего члена последовательности
	previousTerm.push_back(0); // Записываем в вектор предыдущего члена значение первого члена последовательности
    ToPrint(n, m, &currentNumberColumn, &currentNumberRow, 0); // Выводим первый член последовательности
    ToPrint(n, m, &currentNumberColumn, &currentNumberRow, 32); // Выводим пробел после него (если он не понадобится его уберет метод ToPrint)
    while (true) {
           for (int i = 0; i < previousTerm.size(); i++) { 
    	        if (previousTerm[i] == previousTerm[start]) 
    	 	        quantity++; // Считаем количество идущих подряд одинаковых цифр
    	        else {
    		      	currentTerm.push_back(quantity); // Записываем в вектор количество текущих цифр
    	          	currentTerm.push_back(previousTerm[start]); // Записываем саму цифру
    	          	ToPrint(n, m, &currentNumberColumn, &currentNumberRow, quantity);
    	          	ToPrint(n, m, &currentNumberColumn, &currentNumberRow, previousTerm[start]); // Печатаем полученные данные
    	          	start += quantity; // Переходим к следующей цифре для сравнения
    	          	quantity = 1; // Присваиваем количеству одинаковых идущих подряд цифр 1, так как мы перешли к следующей цифре
    	        } // Если значение текущей цифры не совпадает с предыдущим, выполняем вывод и заполнение вектора следующего члена
    	        if (i == (previousTerm.size() - 1)) {
    	            currentTerm.push_back(quantity); 
    	            currentTerm.push_back(previousTerm[start]);
    	            ToPrint(n, m, &currentNumberColumn, &currentNumberRow, quantity);
    	            ToPrint(n, m, &currentNumberColumn, &currentNumberRow, previousTerm[start]);
    	        } // Отдельный вывод для последнего элемента данного члена
           } // Цикл для прохода по всем цифрам предыдущего члена последовательности
           start = 0;      
           quantity = 0; // Обнуляем все параметры для подсчета, так как дальше будем работать со следующим членом последовательности
           ToPrint(n, m, &currentNumberColumn, &currentNumberRow, 32); // Печатаем пробел после текущего члена последовательности
           previousTerm.clear(); 
           previousTerm = currentTerm; // Записываем в вектор предыдущего члена текущий построенный член последовательности
           currentTerm.clear();
    } // Бесконечный цикл, так как условие окончание работы программы задано в методе печати
}