#include <algorithm>
#include <numeric>
#include <utility>
#include <functional>
#include <bitset>
using namespace std;
//
#define lp(i, n) for(int (i)=0; (i)<(int)(n); (i)++)
#define MAX 109
#define dex [i][j]
int DP[MAX][MAX];
int ST[MAX][MAX] = {0};
//
int mark = 0;
int n, m;
int *s1, *s2;
//
int doit(int i = 0, int j = 0)
{
if(i == n || j == m)
return 0;
if(ST dex == mark)
return DP dex;
ST dex = mark;
if(s1[i] == s2[j])
return DP dex = 1 + doit(i+1, j+1);
int c1 = doit(i+1, j);
int c2 = doit(i, j+1);
return DP dex = max(c1, c2);
}
//
int main()
{
while( scanf("%d %d", &n, &m) && !(n == 0 && m == 0) )
{
s1 = new int[n];
s2 = new int[m];
lp(i, n)
scanf("%d", &s1[i]);
lp(i, m)
scanf("%d", &s2[i]);
printf("Twin Towers #%d\nNumber of Tiles : %d\n\n", ++mark, doit());
}
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPG51bWVyaWM+CiNpbmNsdWRlIDx1dGlsaXR5PgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPGJpdHNldD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLy8KI2RlZmluZSBscChpLCBuKSAgICAgICAgIGZvcihpbnQgKGkpPTA7ICAgICAgKGkpPChpbnQpKG4pOyAgIChpKSsrKQojZGVmaW5lIE1BWCAxMDkKI2RlZmluZSBkZXggW2ldW2pdCmludCBEUFtNQVhdW01BWF07CmludCBTVFtNQVhdW01BWF0gPSB7MH07Ci8vCmludCBtYXJrID0gMDsKaW50IG4sIG07CmludCAqczEsICpzMjsKLy8KaW50IGRvaXQoaW50IGkgPSAwLCBpbnQgaiA9IDApCnsKICAgaWYoaSA9PSBuIHx8IGogPT0gbSkKICAgICAgcmV0dXJuIDA7CgogICBpZihTVCBkZXggPT0gbWFyaykKICAgICAgcmV0dXJuIERQIGRleDsKICAgU1QgZGV4ID0gbWFyazsKCiAgIGlmKHMxW2ldID09IHMyW2pdKQogICAgICByZXR1cm4gRFAgZGV4ID0gMSArIGRvaXQoaSsxLCBqKzEpOwoKICAgaW50IGMxID0gZG9pdChpKzEsIGopOwogICBpbnQgYzIgPSBkb2l0KGksIGorMSk7CiAgIHJldHVybiBEUCBkZXggPSBtYXgoYzEsIGMyKTsKfQovLwppbnQgbWFpbigpCnsKICAgd2hpbGUoIHNjYW5mKCIlZCAlZCIsICZuLCAmbSkgJiYgIShuID09IDAgJiYgbSA9PSAwKSApCiAgIHsKICAgICAgczEgPSBuZXcgaW50W25dOwogICAgICBzMiA9IG5ldyBpbnRbbV07CiAgICAgIGxwKGksIG4pCiAgICAgICAgIHNjYW5mKCIlZCIsICZzMVtpXSk7CiAgICAgIGxwKGksIG0pCiAgICAgICAgIHNjYW5mKCIlZCIsICZzMltpXSk7CiAgICAgIHByaW50ZigiVHdpbiBUb3dlcnMgIyVkXG5OdW1iZXIgb2YgVGlsZXMgOiAlZFxuXG4iLCArK21hcmssIGRvaXQoKSk7CiAgIH0KfQ==