#include<bits/stdc++.h>
#define all(v) (v).begin(),(v).end()
#define pb push_back
#define ppb pop_back
#define mp make_pair
#define ri(x) scanf("%d",&(x))
#define ri2(x,y) scanf("%d %d",&(x),&(y))
#define ri3(x,y,z) scanf("%d %d %d",&(x),&(y),&(z))
#define rll(x) scanf("%lld",&(x))
#define rll2(x,y) scanf("%lld %lld",&(x),&(y))
#define rll3(x,y,z) scanf("%lld %lld %lld",&(x),&(y),&(z))
#define gc(x) ((x) = getchar())
using namespace::std;

const long double PI = acos(-1);
const long long MOD = 1000000000 +7;

typedef long long ll;
typedef pair<ll,ll> pll;
typedef pair<ll,pll> tll;
typedef pair<int,int> ii;
typedef pair<int,ii> iii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<iii> viii;
typedef vector<ll> vll;
typedef vector<pll> vpll;
typedef vector<tll> vtll;
typedef vector<string> vs;
typedef set<int> si;
typedef set<ii> sii;
typedef set<iii> siii;

ll gcd(ll a, ll b){ return b==0?a:gcd(b,a%b);}

ll add(ll a, ll b, ll m = MOD){
	if(a >= m) a %= m;
	if(b >= m) b %= m;
	if(a < 0) a += m;
	if(b < 0) b += m;
	ll res = a+b;
	if(res >= m or res <= -m) res %= m;
	if(res < 0) res += m;
	return res;
}

ll mul(ll a, ll b, ll m = MOD){
	if(a >= m) a %= m;
	if(b >= m) b %= m;
	if(a < 0) a += m;
	if(b < 0) b += m;
	ll res = a*b;
	if(res >= m or res <= -m) res %= m;
	if(res < 0) res += m;
	return res;
}

ll pow_mod(ll a, ll b, ll m = MOD){
	ll res = 1LL;
	a = a%m;
	while(b){
		if(b&1) res = mul(res,a,m);
		b >>= 1;
		a = mul(a,a,m);
	}
	return res;
}

ll fastexp(ll a, ll b){
	ll res = 1LL;
	while(b){
		if(b&1) res = res*a;
		b >>= 1;
		a *= a;
	}
	return res;
}

int gcdExtendido(int a, int b, int *x, int *y){
	if(a == 0){
		*x = 0;
		*y = 1;
		return b;
	}
	int x1, y1;
	int gcd = gcdExtendido(b%a,a,&x1,&y1);
	
	*x = y1-(b/a)*x1;
	*y = x1;
	return gcd;
}

int modInverso(int a, int m){
	int x, y;
	int g = gcdExtendido(a,m,&x,&y);
	if(g!=1) return -1;
	else return (x%m + m)%m;
}

/****************************************
*************P*L*A*N*T*I*L*L*A************
*****************************************/

const int N = 4000+5;

int n;
int m;
char a[N];
char b[N];
int pA[N];
int pB[N];
int bestA[N];
int bestB[N];
int nxtA[N][2];
int nxtB[N][2];
int memo[N][N];
bool vis[N][N];
int choice[N][N];

void preprocess(){
	nxtA[n + 1][0] = nxtA[n + 1][1] = n;
	for(int i = n; i >= 0; i--){
		for(int j = 0; j < 2; j++) nxtA[i][j] = nxtA[i+1][j];
		if(a[i] == '0') nxtA[i][0] = i;
		else if(a[i] == '1') nxtA[i][1] = i;
	}
	nxtB[m + 1][0] = nxtB[m + 1][1] = m;
	for(int i = m; i >= 0; i--){
		for(int j = 0; j < 2; j++) nxtB[i][j] = nxtB[i+1][j];
		if(b[i] == '0') nxtB[i][0] = i;
		else if(b[i] == '1') nxtB[i][1] = i;
	}

}

int DP(int i, int j){
	if(i == n + 1 and j == m + 1){
		return 0;
	}
	if(vis[i][j]) return memo[i][j];
	int ans = 1e9;
	for(int c = 0; c < 2; c++){
		int nxti = nxtA[i][c] + 1;
		int nxtj = nxtB[j][c] + 1;
		int cand = 1 + DP(nxti, nxtj);
		if(cand < ans){
			ans = cand;
			choice[i][j] = c;
		}
	}
	vis[i][j] = true;
	return memo[i][j] = ans;
}

void print(int i, int j){
	if(i == n + 1 and j == m + 1){
		putchar('\n');
		return;
	}
	int c = choice[i][j];
	int nxti = nxtA[i][c] + 1;
	int nxtj = nxtB[j][c] + 1;
	putchar('0' + c);
	print(nxti, nxtj);
}

int main(){
	scanf("%s", a);
	scanf("%s", b);
	n = strlen(a);
	m = strlen(b);
	preprocess();
	int len = DP(0, 0);
	print(0, 0);
	return 0;
}


Measured memory_bytes: 115028