package com.ncarzone.wholesaleoperation.web.base;
import org.apache.commons.lang3.StringUtils;
import java.util.*;
/**
* 最長子序列 ,求子序列長度
*/
public class Test3 {
private static TreeSet<String> set = new TreeSet<>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String count = sc.nextLine();
for(int i = 0;i<Integer.valueOf(count);i++){
String X = sc.nextLine();
String Y = sc.nextLine();
int m = X.length();
int n = Y.length();
int[][]table = new int[m+1][n+1];
int length = lcs(m,n,table,X,Y);
traceBack(m,n,"",table,X,Y);
}
Iterator t = set.iterator();
while(t.hasNext()){
String tt = String.valueOf(t.next());
System.out.println(tt);
}
}
/**
* 構造表,並返回X和Y的LCS的長度
*/
static int lcs(int m, int n,int[][]table,String X, String Y)
{
// 表的大小爲(m+1)*(n+1)
// table = vector<vector<int>>(m+1,vector<int>(n+1));
for(int i=0; i<m+1; ++i)
{
for(int j=0; j<n+1; ++j)
{
// 第一行和第一列置0
if (i == 0 || j == 0)
table[i][j] = 0;
else if(X.charAt(i-1) == Y.charAt(j-1))
table[i][j] = table[i-1][j-1] + 1;
else
table[i][j] = table[i-1][j]>table[i][j-1]?table[i-1][j]:table[i][j-1];
}
}
return table[m][n];
}
private static void traceBack(int i ,int j ,String lcs,int[][]table,String X, String Y){
while (i>0 && j>0){
if(X.charAt(i-1) == Y.charAt(j-1)){
lcs += X.charAt(i-1);
--i;
--j;
}else{
if(table[i-1][j] > table[i][j-1]){
--i;
}else if(table[i-1][j] <table[i][j-1]){
--j;
}else{
traceBack(i-1,j,lcs,table,X,Y);
traceBack(i,j-1,lcs,table,X,Y);
return;
}
}
}
if(lcs != ""){
set.add(reverse(lcs));
}
}
private static String reverse(String str){
StringBuilder strBuf = new StringBuilder(str).reverse();
return strBuf.toString();
}
}