program main
character(3000) s,t
integer,allocatable,dimension(:,:)::DP
character(3000) ans
read*,s,t
allocate( DP(0:len_trim(s),0:len_trim(t)) )

!DP(i,j)にはSのi文字目までの部分とTのj文字目までの部分のLCSの長さが格納されています
!初期条件としてDP(0,:)=0及びDP(:,0)=0が既知です。
!一番左上に(0,0)を据えて右下に展開していくとします。
!このときある(i,j)について一つ上の値と一つ左の値を知っていたらば(i,j)を求めることが可能です。

DP=0
do i= 1, len_trim(s)
  do j= 1, len_trim(t)
    DP(i,j)=max(DP(i-1,j),DP(i,j-1)) + merge(1,0,s(i:i)==t(j:j) )
  end do
end do

!一番DPの値が高いところ(DP(len_trim(s),len_trim(t)))から1段ずつ降っていきます
ans=""
i = len_trim(s)
j = len_trim(t)
do
  if( DP(i,j)==DP(i-1,j) )then
    i=i-1
  else if( DP(i,j)==DP(i,j-1) )then
    j=j-1
  else
    if(DP(i,j)==DP(i-1,j)+1)then
      ans=s(i:i)//ans
      i=i-1
    else !(DP(i,j)==DP(i,j-1)+1)のとき
      ans=t(j:j)//ans
      j=j-1
    end if
  end if
  if(i+j==0)exit
end do

print"(A)",trim(ans)
end program main