#include <bits/stdc++.h>
using namespace std;
char a[105], b[105], c[105];
int dp[105][105][105], e[105][26];
int pt[105][105][105];
void build(int n) {
  char s[105] = {};
  for (int i = 0; i <= n; i++) {
    for (s[i] = 'A'; s[i] <= 'Z'; s[i]++)
      for (int& o = e[i][s[i] - 'A'] = i + 1; strncmp(s + i + 1 - o, c, o); o--)
        ;
    s[i] = c[i];
  }
}
void relax(int i, int j, int x, int v, int o) {
  if (dp[i][j][x] >= v) return;
  dp[i][j][x] = v;
  pt[i][j][x] = o;
}
void show(int i, int j, int x) {
  if (!i || !j) return;
  if (pt[i][j][x] == -1) show(i - 1, j, x);
  if (pt[i][j][x] == -2) show(i, j - 1, x);
  if (pt[i][j][x] >= 0) {
    show(i - 1, j - 1, pt[i][j][x]);
    putchar(a[i - 1]);
  }
}
int main() {
  int n = strlen(gets(a));
  int m = strlen(gets(b));
  int l = strlen(gets(c));
  build(l);
  memset(dp, 192, sizeof(dp));
  dp[0][0][0] = 0;
  for (int i = 0; i <= n; i++)
    for (int j = 0; j <= m; j++) {
      for (int x = 0; x < l; x++) {
        relax(i + 1, j, x, dp[i][j][x], -1);
        relax(i, j + 1, x, dp[i][j][x], -2);
        if (i == n || j == m || a[i] - b[j]) continue;
        relax(i + 1, j + 1, e[x][a[i] - 'A'], dp[i][j][x] + 1, x);
      }
    }
  int x = max_element(dp[n][m], dp[n][m] + l) - dp[n][m];
  if (dp[n][m][x])
    show(n, m, x);
  else
    putchar('0');
  puts("");
}
