/*
	1009-4 A Simple Offline Text Editor[1998Tokyo D2]
	コマンドによってテキストを操作するプログラム

	Date:2015-10-11
	Author:笠原 レミン (1W143022-6)
*/
#include <stdio.h>
#include <string.h>
#define TEXT_BUFFER_SIZE 2000
#define COMMAND_BUFFER_SIZE 200

char text[TEXT_BUFFER_SIZE+1];
int length;
int cursor;

/* カーソルを右に1文字移動させる */
void forwardChar() {
	if (cursor < length) cursor++;
}
/* カーソルを右に1単語移動させる */
void forwardWord() {
	for (; text[cursor] == ' ' && cursor < length; cursor++); /* カーソル直後の空白を無視する */
	for (; text[cursor] != ' ' && cursor < length; cursor++);
}
/* カーソルを左に1文字移動させる */
void backwardChar() {
	if (cursor > 0) cursor--;
}
/* カーソルを左に1単語移動させる */
void backwardWord() {
	for (; cursor > 0 && text[cursor-1] == ' '; cursor--); /* カーソル直前の空白を無視する */
	for (; cursor > 0 && text[cursor-1] != ' '; cursor--);
}
/* カーソルの右に文字列を挿入する カーソルは挿入した文字列の右に移動する */
void insert(char *s) {
	char buffer[TEXT_BUFFER_SIZE];
	int l = strlen(s);
	strncpy(buffer, text, cursor); /* カーソルより左 */
	strncpy(buffer + cursor, s, COMMAND_BUFFER_SIZE); /* 挿入部分 */
	strncpy(buffer + cursor + l, text + cursor, TEXT_BUFFER_SIZE - (cursor + l)); /* カーソルより右 */
	strncpy(text, buffer, TEXT_BUFFER_SIZE); /* bufferからtextに戻す */
	length = strlen(text);
	cursor += l;
}
/* カーソルの右をn文字削除する */
void deleteChars(int n) {
	int i;
	if (cursor + n < length) {
		for (i = n; i <= length; i++) text[cursor+i-n] = text[cursor+i]; /* 削除部分より後ろの文字を左へ詰める */
	} else {
		text[cursor] = '\0'; /* カーソルの右にn文字以上無い */
	}
	length = strlen(text);
}
/* カーソルの右を1文字削除する */
void deleteChar() {
	deleteChars(1);
}
/* カーソルの右を1単語削除する */
void deleteWord() {
	int i = 0;
	/* 単語の終わりを探す */
	for (; text[cursor + i] == ' ' && cursor + i < length; i++);
	if (cursor + i == length) return; /* 単語が無ければ何も削除しない */
	for (; text[cursor + i] != ' ' && cursor + i < length; i++);
	deleteChars(i);
}

/* テキストの状態をカーソルを含めて出力する */
void printText() {
	int i;
	for (i = 0; i < cursor; i++) printf("%c", text[i]); /* カーソルより左 */
	printf("^"); /* カーソル */
	for (; i < length; i++) printf("%c", text[i]); /* カーソルより右 */
	printf("\n");
}

int main(void) {
	int n; /* データセット数 */
	int m; /* コマンド数 */
	char command[110];
	int i, j;

	scanf("%d%*1[\n]", &n);
	for (i = 0; i < n; i++) {
		/* 初期テキストを読み込む */
		fgets(text, TEXT_BUFFER_SIZE, stdin);
		length = strlen(text);
		/* 改行を除去する */
		text[length - 1] = '\0';
		length--;
		/* カーソルの位置を探す */
		cursor = 0;
		for (j = 0; j < length; j++) {
			if (text[cursor] == '^') {
				cursor = j;
				text[cursor] = ' ';
			}
		}

		/* コマンドを処理する */
		scanf("%d%*1[\n]", &m);
		for (j = 0; j < m; j++) {
			fgets(command, COMMAND_BUFFER_SIZE, stdin);

			int l = strlen(command);
			if (command[l - 1] == '\n') command[l - 1] = '\0'; /* 改行除去 */

			if (strcmp(command, "forward char") == 0) forwardChar();
			else if (strcmp(command, "forward word") == 0) forwardWord();
			else if (strcmp(command, "backward char") == 0) backwardChar();
			else if (strcmp(command, "backward word") == 0) backwardWord();
			else if (strcmp(command, "delete char") == 0) deleteChar();
			else if (strcmp(command, "delete word") == 0) deleteWord();
			else if (strncmp(command, "insert", 6) == 0) {
				l = strlen(command);
				if (command[l - 1] == '\"') command[l - 1] = '\0'; /* 最後の「"」をNULL文字に置換する */
				insert(command + 8); /* 「insert "」の次の文字から先を insert する */
			}
		}

		printText(); /* 出力 */
	}
    return 0;
}

Measured memory_bytes: 596