int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        int m = 3 * n, temp = 1, count = 0;
        int val = m;
        for (int i = 0; i < m + n; i++) {
            if (i < m) {  //判断当前行是否为叶子行数
                if (i % 3 == 0 && i != 0) count++;  //记录三角形图案形成数量
                for (int j = val--; j > 1; j--) {  //输出树前端空格
                    printf(" ");
                }
                for (int k = temp++, l = 0; k > 0; k--, l++) {  //输出当前行所需的符号*,l记录输出次数
                    if (count > 0 && (i + 1) % 3 != 0) {  //判断是否处于特殊行,三角形第一行与第二行
                        if ((i + 1) % 3 == 1) {  //处于第一行
                            for (int x = 0; x <= count; x++) {  //输出* 后输出两次双空格
                                printf("* ");
                                for (int y = 0; y < 2; y++) {
                                    printf("  ");
                                }
                            }
                        } else {  //处于第二行
                            for (int x = 0; x <= count; x++) {  //输出* * 后输出一次双空格
                                printf("* * ");
                                for (int y = 0; y < 1; y++) {
                                    printf("  ");
                                }
                            }
                        }  //判断特殊行输出次数是否等于实际个数
                        if (l = count) {
                            l = 0;
                            break;
                        }
                    } else printf("* ");  //正常行数输出
                }
            } else {  //根行数输出
                for (int z = 0; z < m - 1; z++) printf(" ");
                printf("*");
            }
            printf("\n");
        }
    }
    return 0;
}