#include <iostream>
#include <cstdio>
using namespace std;
//这道题不难,但是坑点真的是非常多,花了非常多的时间才把全部测试点过掉
//pat的数据非常的坑,坑点十足,拿分不难,满分很难
//解题思路:
//题意是给定一个数和其进制,找到使另一个数与其相等的进制
//那么将给定的数转化成十进制,再使用二分查找另一个数的进制
//坑点:转换回十进制很容易就会越过数据大小,会有一组非常大的进制数据卡二分法,要输出满足的最小进制
//二分的两个边界的设定,其中low为第二个数的maxdigit + 1,hign为第一个数的大小num + 1;
typedef long long ll;
//找二分下界,即单位最大的数
int find_mx(const string &t)
{
int mx(0);
for(int i = 0; i < t.size(); i++)
{
if(isdigit(t[i]))
{
mx = max(mx,t[i] - '0');
}
else if(islower(t[i]))
{
mx = max(mx,t[i] - 'a' + 10);
}
}
return mx;
}
//转化成十进制
void convert(const string &t, ll k, ll &res)
{
res = 0;
for(int i = 0; i < t.size(); i++)
{
if(isdigit(t[i]))
{
res = (t[i] - '0') + res * k;
}
else if(islower(t[i]))
{
res = (t[i] - 'a' + 10) + res * k;
}
}
}
ll num(0);
ll hign, low, ans(-1);
void find_rad(const string &t)
{
// cout << hign << " " << low << endl;
ll res(0);
while(low <= hign)
{
ll mid = (hign + low) / 2;
convert(t, mid, res);
// 当res < 0时已经越界,往下查找
if(res > num || res < 0)
{
hign = mid - 1;
}
// 相等则保存下来然后继续找更小值
else if(num == res)
{
ans = mid;
hign = mid - 1;
}
else
{
low = mid + 1;
}
}
}
int t;
int main()
{
string a, b;
int tag, rad;
cin >> a >> b >> tag >> rad;
string t;
if(tag == 1) t = a;
else t = b;
// 先转化第一个数
convert(t, rad, num);
if(tag == 1) t = b;
else t = a;
// 设定二分查找的上下界
low = find_mx(t) + 1;
hign = num + 1;
//查找第二个数的进制
find_rad(t);
if(ans != -1)
cout << ans << endl;
else cout << "Impossible" << endl;
return 0;
}