#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 101

int cmp(const void* a, const void* b) {
    return strcmp(*((char**)a), *((char**)b));
}

int main() {
    //创建一个动态数组
    char* SubString[MAX] = {NULL};
    SubString[0] = (char*)malloc(sizeof(char) * MAX);
    scanf("%s", SubString[0]);
    //这是串长,也是子串总个数
    int Length = strlen(SubString[0]);
    //接下来将所有的子串都存下来
    for (int i = 1; i < Length; i++) {
        //动态分配了内存
        SubString[i] = (char*)malloc(sizeof(char) * MAX);
        strcpy(SubString[i], SubString[0] + i);//从 SubString[0] 字符串的第 i 个字符开始,复制剩余的字符串到 SubString[i] 指向的新分配的内存中
    }


    //将SubString中所有的字符串都进行排序
    qsort(SubString, Length, sizeof(char*), cmp);

    //将所有子串输出
    for (int i = 0; i < Length; i++)
        printf("%s\n", SubString[i]);

    //一定要注意,将所有的动态分配的部分都释放
    for (int i = 0; i < Length; i++) {
        free(SubString[i]);
    }
    return 0;
}