#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int N, M, Krez, pomeraj;
vector<char> put1, put2;
vector<int> transfList[100001][101];
ofstream outFile("planete.00.out");

void ucitavanje()
{
	int i;
	char ch;

	ifstream inFile("planete.00.in");
	
	inFile >> N >> M;

	do
	{
		inFile >> ch;
	} while ((ch < 'a') || (ch > 'z'));

		put2.push_back(ch);	

	for (i = 0; i < N - 1; i++)
	{
		inFile >> ch;
		put2.push_back(ch);
	}

	do
	{
		inFile >> ch;
	} while ((ch < 'a') || (ch > 'z'));

	put1.push_back(ch);	

	for (i = 0; i < M - 1; i++)
	{
		inFile >> ch;
		put1.push_back(ch);
	}

	inFile.close();
}

bool postoji(int i, int j, int k)
{
	bool already = false;
	int l = 0;
	while ((!already) && (l < transfList[i][j].size()))
	{
		if ((transfList[i][j][l] >> 3) == k)
			already = true;
		l++;
	}
	return already;
}

int obrada()
{

	int i, j, k, l, t;
	bool found1, found2;

	transfList[0][0].push_back(0);

	/// main loop
	for (k = 0; k <= 100; k++)
	{
		found1 = false;
		
		found2 = false;

		cout << k << endl;

		for (i = 0; i <= put1.size(); i++)
			for (l = 0; l < transfList[i][k].size(); l++)
			{
				j = transfList[i][k][l] >> 3;
				/// brisanje i + 1
				if (i < put1.size())
					if (k + 1 + abs(put1.size() - (i + 1) - put2.size() + j) <= 100)
						if (!postoji(i + 1, k + 1, j))
						{
							transfList[i + 1][k + 1].push_back((j << 3) | 1);
							if ((i + 1 == put1.size()) && (j == put2.size()))
								found2 = true;
						}
				/// dodavanje izmedju i i i + 1
				if (j < put2.size())
					if (k + 1 + abs(put1.size() - i - put2.size() + j + 1) <= 100)
						if (!postoji(i, k + 1, j + 1))
						{
							transfList[i][k + 1].push_back(((j + 1) << 3) | 2);
							if ((i == put1.size()) && (j + 1 == put2.size()))
								found2 = true;
						}
				/// zadrzavanje ili promena i + 1
				if ((i < put1.size()) && (j < put2.size()))
					/// zadrzavanje i + 1
					if (put1[i] == put2[j])
					{
						if (!postoji(i + 1, k, j + 1))
						{
							transfList[i + 1][k].push_back(((j + 1) << 3) | 3);
							if ((i + 1 == put1.size()) && (j + 1 == put2.size()))
								found1 = true;
						}
					}
					/// promena i + 1
					else
					{
						if (k + 1 + abs(put1.size() - i - put2.size() + j) <= 100)
							if (!postoji(i + 1, k + 1, j + 1))
							{
								transfList[i + 1][k + 1].push_back(((j + 1) << 3) | 4);
								if ((i + 1 == put1.size()) && (j + 1 == put2.size()))
									found2 = true;
							}
					}
				/// zamena i + 1 i i + 2
				if ((i + 1 < put1.size()) && (j + 1 < put2.size()))
					if ((put1[i] == put2[j + 1]) && (put1[i + 1] == put2[j]) && (put1[i] != put1[i + 1]))
						if (k + 1 + abs(put1.size() - i - put2.size() + j) <= 100)
							if (!postoji(i + 2, k + 1, j + 2))
							{
								transfList[i + 2][k + 1].push_back(((j + 2) << 3) | 5);
								if ((i + 2 == put1.size()) && (j + 2 == put2.size()))
									found2 = true;
							}
			}

		if (found1)
			return k;
		else
			if (found2)
			return k + 1;
	}

	return -1;
}

void stampanje(int i, int k, int j)
{
     int l, c;
     bool ponovi = true;
     
     while (ponovi)
     {
         ponovi = false;
         
		 l = 0;
         while (l < transfList[i][k].size())
         {
               if ((transfList[i][k][l] >> 3) == j)
                  break;
               else
                   l++;
         }
         
         c = transfList[i][k][l] & 7;
         
         switch (c)
         {
                case 1 :
                     stampanje(i - 1, k - 1, j);
                     outFile << "3 " << i + pomeraj << endl;
                     pomeraj--;
                     break;
                     
                case 2 :
                     stampanje(i, k - 1, j - 1);
                     outFile << "2 " << i + 1 + pomeraj << " " << put2[j - 1] << endl;
                     pomeraj++;
                     break;
                     
                case 3 :
                     i--;
                     j--;
                     ponovi = true;
                     break;
                     
                case 4 :
                     stampanje(i - 1, k - 1, j - 1);
                     outFile << "1 " << i + pomeraj << " " << put2[j - 1] << endl;
                     break;
                     
                case 5 :
                     stampanje(i - 2, k - 1, j - 2);
                     outFile << "4 " << i - 1 + pomeraj << endl;
         }
     }
}

int main()
{
	ucitavanje();
	Krez = obrada();
	outFile << Krez << endl;
	pomeraj = 0;
	if (Krez > -1)
       stampanje(put1.size(), Krez, put2.size());
	outFile.close();

	return 0;
}
