def get_i() #空白区切の入力を数値(整数)の配列で返す
  return gets.chomp.split(" ").map(&:to_i)
end
def get_f() #空白区切の入力を数値(実数)の配列で返す
  return gets.chomp.split(" ").map(&:to_f)
end
def get() #空白区切の入力を文字列の配列で返す
  return gets.chomp.split(" ")
end
def get_nsp() #入力されたものを一文字ずつに区切った文字列の配列で返す
  return gets.chomp.split("")
end
def yn_judge(bool,y="Yes",n="No") #boolに真偽を投げることで、trueならy、falseならnの値を出力する
  return bool ? y : n 
end
def array(size,n=1,init=nil) #nに配列の次元数、sizeに配列の大きさ、initに初期値を投げることでその配列を返す
  if n==1
    return Array.new(size){init}
  else
    return Array.new(n).map{Array.new(size){init}}
  end
end

def max(a,b)
  return a>b ? a : b
end
s=get_nsp
s_size=s.size
t=get_nsp
t_size=t.size
dp=Array.new(s_size+1){Array.new(t_size+1){0}}
s_size.times do|i|
  t_size.times do|j|
    if s[i]==t[j]
      dp[i+1][j+1]=dp[i][j]+1
    else
      dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j])
    end
  end
end
ans=[]

while s_size>0 and t_size
  if dp[s_size][t_size]==dp[s_size-1][t_size]
    s_size-=1
  elsif dp[s_size][t_size]==dp[s_size][t_size-1]
    t_size-=1
  else #dp[s_size][t_size]==dp[s_size-1][t_size-1]
    s_size-=1
    t_size-=1
    ans.push(s[s_size])
  end
end
puts ans.reverse.join("")
