#include<bits/stdc++.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define HUGE_NUM 99999999999999999
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;



#define MAX_ROW 105
#define MAX_COL 1005

int num_row = 0;
int row_CURSOR,col_CURSOR;
char table[MAX_ROW][MAX_COL],work[MAX_COL];


int main(){

	while(true){

		fgets(table[num_row],MAX_COL,stdin); //スペースあり

		if(table[num_row][0] == 'E' && table[num_row][1] == 'N' && table[num_row][2] == 'D' && table[num_row][3] == '_' &&
			table[num_row][4] == 'O' && table[num_row][5] == 'F' && table[num_row][6] == '_' && table[num_row][7] == 'T' && table[num_row][8] == 'E' &&
			table[num_row][9] == 'X' && table[num_row][10] == 'T' && (table[num_row][11] == '\n' || table[num_row][11] == '\0')){
			break;
		}
		int len = strlen(table[num_row]);
		table[num_row][len-1] = '\0';

		num_row++;
	}


	//カーソルの初期位置を設定
	row_CURSOR = 0;
	col_CURSOR = 0;

	//バッファを空にしておく
	work[0] = '\0';

	char command[2];

	while(true){

		scanf("%s",command);
		if(command[0] == '-')break;

		switch(command[0]){
		case 'a':
			/*カーソルを現在の行の先頭文字に移動する。*/

			col_CURSOR = 0;
			break;

		case 'e':
			/*カーソルを現在の行の行末に移動する。*/

			col_CURSOR = strlen(table[row_CURSOR]);
			break;

		case 'p':
			/*上に行があれば、カーソルを上の行の先頭文字に移動する。
			上に行がなければ、カーソルを先頭文字に移動する。*/

			if(row_CURSOR == 0){

				//Do nothing

			}else{

				row_CURSOR--;
			}
			col_CURSOR = 0;

			break;

		case 'n':
			/*下に行があれば、カーソルを下の行の先頭文字に移動する。
			下に行がなければ、カーソルを先頭文字に移動する。*/

			if(row_CURSOR == num_row-1){

				//Do nothing

			}else{

				row_CURSOR++;
			}
			col_CURSOR = 0;

			break;

		case 'f':
			/*カーソルが行末にない場合、カーソルを１つ右に移動する。
			カーソルが行末にありかつ下に行がある場合は、カーソルを下の行の先頭文字へ移動する。
			それ以外の場合は何もしない。*/

			if(col_CURSOR < strlen(table[row_CURSOR])){

				col_CURSOR++;

			}else if(col_CURSOR == strlen(table[row_CURSOR]) && row_CURSOR < num_row-1){

				row_CURSOR++;
				col_CURSOR = 0;
			}

			break;
		case 'b':
			/*カーソルが先頭文字でないならば、カーソルを１つ左に移動する。
			カーソルが先頭文字でありかつ上に行がある場合は、カーソルを上の行の行末へ移動する。
			それ以外の場合は何もしない。*/

			if(col_CURSOR > 0){

				col_CURSOR--;

			}else if(col_CURSOR == 0 && row_CURSOR > 0){

				row_CURSOR--;
				col_CURSOR = strlen(table[row_CURSOR]);
			}

			break;

		case 'd':
			/*d
			カーソルが【文字を指す場合は】その文字を削除する。削除された文字の右側の文字列は左にシフトされる。
			カーソルが行末を指し下に行がある場合は、下の行をそのままカーソルの位置に繋げる。以下の行は上にシフトされる。
			それ以外の場合は何もしない。*/

			if(col_CURSOR < strlen(table[row_CURSOR])){ //カーソルが文字を指し示す場合

				for(int col = col_CURSOR+1; table[row_CURSOR][col-1] != '\0'; col++){ //左に1文字シフト

					table[row_CURSOR][col-1] = table[row_CURSOR][col];
				}

			}else if(row_CURSOR < num_row-1){ //カーソルが行末を指し、下に行がある場合

				//下の行をそのままカーソルの位置につなげる
				strcpy(table[row_CURSOR]+col_CURSOR,table[row_CURSOR+1]);

				//以下の行を上にシフトする
				for(int row = row_CURSOR+2; row < num_row; row++){

					strcpy(table[row-1],table[row]);
				}
				num_row--;
			}

			break;

		case 'k':
			/*カーソルが行末にある場合、下に行があれば、d と同じ操作をしバッファに１つの改行を記録する。
			カーソルが行末にない場合、カーソルが指す文字を含めた右側【すべての文字】を切り取りそれをバッファに記録する。カーソルは元の行の行末を指すようになる。全ての記録においてバッファは上書きされる。
			それ以外の場合は何もしない。*/

			if(col_CURSOR == strlen(table[row_CURSOR])){ //カーソルが行末にある場合

				if(row_CURSOR < num_row-1){ //下に行がある

					//dと同じ操作
					strcpy(table[row_CURSOR]+col_CURSOR,table[row_CURSOR+1]);

					//以下の行を上にシフトする
					for(int row = row_CURSOR+2; row < num_row; row++){

						strcpy(table[row-1],table[row]);
					}
					num_row--;

					//バッファに改行を記録
					work[0] = '\n';
					work[1] = '\0';
				}

			}else{ //カーソルが行末にない場合

				strcpy(work,table[row_CURSOR]+col_CURSOR);
				table[row_CURSOR][col_CURSOR] = '\0';
			}

			break;

		case 'y':
			/*バッファが空の場合はなにもしない。
			バッファの内容が改行の場合、カーソルが指す【文字の直前で】改行を行う。カーソルは新しい行の先頭文字へ移動する。
			バッファの内容が文字列の場合、カーソルの位置にバッファの内容を挿入する。カーソルの位置はもともと指していた文字または行末の場所へ移動する。*/

			if(work[0] == '\0')break;

			if(work[0] == '\n'){

				//下にシフト
				for(int row = num_row-1; row >= row_CURSOR+1; row--){
					strcpy(table[row+1],table[row]);
				}
				strcpy(table[row_CURSOR+1],table[row_CURSOR]+col_CURSOR);

				table[row_CURSOR][col_CURSOR] = '\0';

				num_row++;

				row_CURSOR++;
				col_CURSOR = 0;

			}else{

				int work_length = strlen(work);

				for(int col = strlen(table[row_CURSOR]); col >= col_CURSOR; col--){ //右シフト

					table[row_CURSOR][col+work_length] = table[row_CURSOR][col];
				}

				for(int col = 0; col < work_length; col++){

					table[row_CURSOR][col_CURSOR+col] = work[col];
				}

				col_CURSOR += work_length;
			}

			break;
		}
	}

	for(int row = 0; row < num_row; row++){

		printf("%s\n",table[row]);
	}

	return 0;
}




Measured memory_bytes: 3188