#include <stdio.h>
#include <string.h>
#include <assert.h>

void reverse(char* left, char* right)
{
    assert(left && right);

    while (left <= right)
    {
        int ret = *left;
        *left = *right;
        *right = ret;
        left++;
        right--;
    }
}

int main()
{
    char ch[10001] = { 0 };
    int i = 0;
    while ((ch[i] = getchar()) != '\n')
    {
        if ((ch[i] < 'A' || ch[i] > 'Z') && (ch[i] < 'a' || ch[i] > 'z'))
        {
            ch[i] = ' ';
        }
        i++;
    }
    //删除换行符
    ch[i] = 0;

    int sz = strlen(ch) - 1;
    //先逆置整个字符串
    reverse(ch, ch + sz);
    
    //再逆置单词
    char* pc = ch;
    while (*pc)
    {
        char* start = pc;
        char* end = pc;
        while (*end != ' ' && *end != '\0')
        {
            end++;
        }
        reverse(start, end - 1);
        if (end != '\0')
            pc = end + 1;
        else
            pc = end;
    }

    //将多个空格转换为一个空格进行输出
    char* end = ch;
    char* start = ch;
    while (*end)
    {
        if (*end != ' ')
            printf("%c", *end++);
        else
        {
            start = end;
            while (*start == ' ')
            {
                start++;
            }
            end = start;
            printf(" ");
        }
    }

    return 0;
}