#include <stdio.h>
#include <stdlib.h>

void dfs(int arr[], int pos, int take_num, int n, int next, int is_first) {
	if (pos >= take_num) {
		/* 1個の組み合わせが最後まで求まった */
		int i;
		if (is_first == 0) printf(", ");
		/* 組み合わせを出力する */
		printf("{ ");
		for (i = 0; i < take_num; i++) {
			if (i > 0) putchar(',');
			if (take_num == n) {
				printf("%d", arr[i] + 1);
			} else {
				printf("%d", arr[i]);
			}
		}
		printf(" }");
		if (take_num == 1 && n > 1 && is_first) putchar(' ');
	} else {
		int i;
		/* 組み合わせを作る数字が足りないので、枝刈りを行う */
		if (n - next + 1 < take_num - pos) return;
		/* 次の数字を探索する */
		for (i = next; i < n; i++) {
			arr[pos] = i;
			dfs(arr, pos + 1, take_num, n, i + 1, is_first);
			is_first = 0;
		}
	}
}

int main(void) {
	int n;
	int i;
	int *arr;
	/* 入力 */
	if (scanf("%d", &n) != 1 || n <= 0) {
		puts("bad input");
		return 1;
	}
	/* メモリ確保 */
	arr = (int *) malloc(sizeof(int) * n);
	if (arr == NULL) {
		puts("memory allocate error");
		return 1;
	}
	/* 各rごとに組み合わせを取得する */
	for (i = 1; i <= n; i++) {
		dfs(arr, 0, i, n, 0, 1);
		putchar('\n');
	}
	free(arr);
	return 0;
}
