#include <bits/stdc++.h>
using namespace std;
const int N = 1e2 + 10, mod = 1e9 + 7;
string s1, s2, v, rt = "", nw = "";
int n, m, k, ans, f[N], nxt[N][26];
bool is[N][N][N][N];
void go(int x, int y, int st, int ret) {
  if (st == k || is[x][y][st][ret]) return;
  is[x][y][st][ret] = true;
  if (ans < ret) ans = ret, rt = nw;
  if (x == n || y == m) return;
  if (s1[x] == s2[y]) {
    nw += s1[x];
    go(x + 1, y + 1, nxt[st][s1[x] - 'A'], ret + 1);
    nw.pop_back();
  }
  go(x, y + 1, st, ret);
  go(x + 1, y, st, ret);
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> s1 >> s2 >> v;
  n = s1.length(), m = s2.length(), k = v.length();
  f[0] = 0;
  int tmp = 0;
  for (int i = 1; i < k; i++) {
    while (tmp && v[tmp] != v[i]) tmp = f[tmp - 1];
    if (v[tmp] == v[i]) tmp++;
    f[i] = tmp;
  }
  for (int i = 0; i <= k; i++)
    for (int j = 0; j < 26; j++) {
      if (i < k && v[i] == 'A' + j)
        nxt[i][j] = i + 1;
      else if (i > 0)
        nxt[i][j] = nxt[f[i - 1]][j];
    }
  go(0, 0, 0, 0);
  if (!ans) rt = "0";
  cout << rt;
  return 0;
}
