#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;


enum Type{
	SPRIT,
	JOIN,
};

enum Ret{
	ALL_GOOD,
	OK,
	NOT,
	EVEN,
	SPECIAL,
};

struct Info{

	Info(Type arg_type,int arg_a,int arg_b){
		type = arg_type;
		a = arg_a;
		b = arg_b;
	}

	Type  type;
	int a,b;
};

struct Data{

	Data(){
		str = "";
		id = 0;
	}

	Data(string arg_str,int arg_id){
		str = arg_str;
		id = arg_id;
	}

	string str;
	int id;
};

Ret is_ok(string str){

	int num_good = 0,num_bad = 0;

	for(int i = 0; i < str.size(); i++){

		if(str[i] == 'o'){

			num_good++;
		}else{
			num_bad++;
		}
	}

	if(num_good < num_bad){

		return NOT;

	}else if(num_good > num_bad){

		if(num_good == str.size()){

			return ALL_GOOD;

		}else{

			return OK;
		}

	}else{ //num_good == num_bad

		//入力では、oxかxoのみから構成されていなければ不可

		for(int i = 0; i < str.size()-1; i += 2){

			if(str[i] == str[i+1]){

				return EVEN;
			}
		}

		return SPECIAL;
	}
	return NOT; //バグ
}

void func(){

	string str;
	cin >> str;

	Ret ret = is_ok(str);

	if(ret == NOT || ret == EVEN){

		printf("-1\n");
		return;

	}else if(ret == SPECIAL || ret == ALL_GOOD){

		printf("%d\n",(str.size()-1)/2);

		for(int i = 0; i < (str.size()-1)/2; i++){

			printf("split %d 1\n",2*i);
		}

		return;
	}

	queue<Data> Q;
	Q.push(Data(str,0));

	vector<Info> ANS;

	int last_id = 0;
	Ret ret2;

	while(!Q.empty()){

		Data tmp = Q.front();
		Q.pop();

		//printf("%s\n",tmp.str.c_str());

		ret = is_ok(tmp.str);

		if(ret == ALL_GOOD || ret == SPECIAL){ //2以下に切り出す

			for(int i = 0; i < (tmp.str.size()-1)/2; i++){

				if(i == 0){

					ANS.push_back(Info(SPRIT,tmp.id,1));

				}else{

					ANS.push_back(Info(SPRIT,last_id,1));
				}

				last_id += 2;
			}

			continue;
		}else if(ret == NOT){

			printf("-1\n");
			return;
		}

		if(tmp.str[0] == 'o'){

			if(tmp.str[1] == 'x'){  //左端を切り出す

				ANS.push_back(Info(SPRIT,tmp.id,1));
				last_id += 2;

				if(tmp.str.size()-2 > 2){
					Q.push(Data(tmp.str.substr(2),last_id));
				}

			}else if((tmp.str[tmp.str.size()-1] == 'o' && tmp.str[tmp.str.size()-2] == 'x') ||
					(tmp.str[tmp.str.size()-1] == 'x' && tmp.str[tmp.str.size()-2] == 'o')){ //右端を切り出す

				ANS.push_back(Info(SPRIT,tmp.id,tmp.str.size()-3));
				last_id += 2;
				if(tmp.str.size()-2 > 2){
					Q.push(Data(tmp.str.substr(0,tmp.str.size()-2),last_id-1));
				}

			}else{ //tmp_str[1] == 'o' //左端の'o'を右端にくっつける

				ANS.push_back(Info(SPRIT,tmp.id,0));
				ANS.push_back(Info(JOIN,last_id+2,last_id+1));
				last_id += 3;
				Q.push(Data(tmp.str.substr(1)+tmp.str[0],last_id));
			}

		}else if(tmp.str[tmp.str.size()-1] == 'o'){ //左端がxで右端がo

			if(tmp.str[tmp.str.size()-2] == 'x'){ //右端を切り出す

				ANS.push_back(Info(SPRIT,tmp.id,tmp.str.size()-3));
				last_id += 2;
				if(tmp.str.size()-2 > 2){
					Q.push(Data(tmp.str.substr(0,tmp.str.size()-2),last_id-1));
				}

			}else{ //tmp_str[tmp.str.size()-2] == 'o' //右端の'o'を左端にくっつける

				ANS.push_back(Info(SPRIT,tmp.id,tmp.str.size()-2));
				ANS.push_back(Info(JOIN,last_id+2,last_id+1));
				last_id += 3;
				Q.push(Data(tmp.str[tmp.str.size()-1]+tmp.str.substr(0,tmp.str.size()-1),last_id));
			}
		}else{ //★★xooo...ox

			//文字列を分割する(x単独も不可)

			int divide_point = -1;
			for(int mid = 0; mid < tmp.str.size()-1; mid++){

				ret = is_ok(tmp.str.substr(0,mid+1));
				ret2 = is_ok(tmp.str.substr(mid+1));

				if(ret == NOT || ret2 == NOT)continue;

				divide_point = mid;
				break;
			}
			if(divide_point == -1){

				printf("-1\n");
				return;
			}

			ANS.push_back(Info(SPRIT,tmp.id,divide_point));
			last_id += 2;


			if(ret == EVEN || ret2 == EVEN){ //★すぐにjoinする★

				ANS.push_back(Info(JOIN,last_id,last_id-1));
				Q.push(Data(tmp.str.substr(divide_point+1)+tmp.str.substr(0,divide_point+1),last_id+1));
				last_id++;
			}else{ //xxoooooxx

				if(divide_point >= 2){
					Q.push(Data(tmp.str.substr(0,divide_point+1),last_id-1));
				}

				if(tmp.str.size()-(divide_point+1) > 2){
					Q.push(Data(tmp.str.substr(divide_point+1),last_id));
				}
			}
		}
	}

	printf("%lld\n",ANS.size());

	for(int i = 0; i < ANS.size(); i++){

		if(ANS[i].type == SPRIT){

			printf("split %d %d\n",ANS[i].a,ANS[i].b);

		}else{

			printf("join %d %d\n",ANS[i].a,ANS[i].b);
		}
	}
}

int main(){

	int num_case;
	scanf("%d",&num_case);

	for(int loop = 0; loop < num_case; loop++){

		func();
	}

	return 0;
}



Measured memory_bytes: 3364