#include<bits/stdc++.h>
#define pb push_back
using namespace std;
struct TreeNode {
char val;
TreeNode *left;
TreeNode *right;
TreeNode() : val('#'), left(nullptr), right(nullptr) {}
TreeNode(char x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(char x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
vector<char> preorder;
vector<char> inorder;
int n;
unordered_map<char, int> mp;
//pl, pr表示树的节点在前序遍历中的起始下标与终止下标
//il, ir表示树的节点在中序遍历中的起始下标与终止下标
TreeNode* build(int pl, int pr, int il, int ir) {
if(pl > pr) return NULL;
//根节点为前序遍历中的起始节点
char ch = preorder[pl];
//确定根节点在中序遍历中的下标
int k = mp[preorder[pl]];
//构建根节点
auto root = new TreeNode(ch);
//递归构建左子树
//易得在中序遍历中的左子树起始、终止下标为il, k - 1
//易得在前序遍历中的左子树起始下标为pl + 1
//又因为在前序、中序遍历中表示的左子树长度相等, 设在前序遍历中左子树的终止下标为x
//则x - (pl + 1) + 1 = k - 1 - il + 1,即x = k + pl - il
root -> left = build(pl + 1, k + pl - il, il, k - 1);
//递归构建右子树
//计算方法与得到左子树的起始、终止下标类似
root -> right = build(k + pl - il + 1, pr, k + 1, ir);
return root;
}
TreeNode* buildTree() {
//记录中序遍历节点在中序遍历中的位置
//这样可以根据前序遍历先得到根节点的值,再确定根节点在中序遍历中的位置
for(int i = 0; i < n; i ++) {
mp[inorder[i]] = i;
}
TreeNode* root = build(0, n - 1, 0, n - 1);
return root;
}
//后序遍历
void postorder(TreeNode* root) {
if(root) {
postorder(root -> left);
postorder(root -> right);
cout << root -> val;
}
}
int main() {
string s1, s2;
cin >> s1 >> s2;
n = s1.length();
for(int i = 0; i < n; i ++) preorder.pb(s1[i]);
for(int i = 0; i < n; i ++) inorder.pb(s2[i]);
TreeNode* root = buildTree();
postorder(root);
return 0;
}