//------------------------------------------------------------------------------
//  標準入力の各行を逆順にして標準出力する
//------------------------------------------------------------------------------

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


#define  MAX_LINE   1000    // 入力行の最大長

typedef struct  LN_LINK     // 各行のリンクリスト
{
    struct LN_LINK  *next;
    char    line[1];
}
LINE_LINK;


int     main( int argc, char *argv[] )
{
    char    line[ MAX_LINE ];
    LINE_LINK   *top_lp;
    LINE_LINK   *cur_lp;

  // 標準入力の各行を読み込んで、リンクリストにスタックする
    top_lp = NULL;
    while( fgets( line, MAX_LINE, stdin ) != NULL )
    {
        cur_lp = (LINE_LINK*) malloc( sizeof( LINE_LINK ) + strlen( line ) );
        if( cur_lp == NULL )    // メモリーが足りない?
        {
            while( fgets( line, MAX_LINE, stdin ) != NULL )
                continue;   // 残りの行を読み飛ばす
            break;
        }
        strcpy( cur_lp->line, line );
        cur_lp->next = top_lp;
        top_lp = cur_lp;
    }

  // リンクリストの先頭から各行を取り出して標準出力に書き出す
    while( top_lp != NULL )
    {
        fputs( top_lp->line, stdout );

        cur_lp = top_lp;
        top_lp = top_lp->next;
        free( cur_lp );
    }
    return 1;
}