#include <iostream>
#include <math.h>
#include <algorithm>
using namespace std;
long long radix_transform(string a,long long radix){//先把能确定的a数转成十进制,方便比较
long long res=0;
reverse(a.begin(),a.end());
for(int i=0;i<a.size();i++){
if(a[i]>='0'&&a[i]<='9') res+=((a[i]-'0')*pow(radix,i));
else if(a[i]>='a'&&a[i]<='z') res+=((a[i]-'a'+10)*pow(radix,i));
}
return res;
}
long long find_radix(string b,long long res){//现在b的进制未知,最好二分查找
char it=*max_element(b.begin(),b.end());//找到b最大数位
long long low=(isdigit(it)?it-'0':it-'a'+10)+1;//b数的最小进制通过b数的最大数位判断
long long high=max(res,low);//考虑到a,b本身的进制大小问题,a的最大进制和b数最小进制中的最大值
//b数的数位限制了b数最少是现在的进制
//为了与a数相等,b数最多是a的最大进制
//当前进制(权)太大了:cur_num>res,正确进制在左边
//当前进制(权)太小了:cur_num<res,正确进制在右边
//但是此题long long仍然不够存,进制太大可能溢出,cur_num<0
while(low<=high){
long long mid=(low+high)/2;
long long cur_num=radix_transform(b,mid);
if(cur_num==res){
return mid;
}else if(cur_num>res || cur_num<0){
high=mid-1;
}else{
low=mid+1;
}
}
return -1;
}
int main() {
string N1,N2;
long long tag,radix;
cin>>N1>>N2>>tag>>radix;
long long res_radix;
if(tag==1){
res_radix=find_radix(N2,radix_transform(N1,radix));
}else{
res_radix=find_radix(N1,radix_transform(N2,radix));
}
if(res_radix==-1) printf("Impossible");
else printf("%lld",res_radix);
return 0;
}
//其实不用倒转容器
long long transformRadix(string num,long long radix){//先把能确定的转成十进制
long long res=0;
for(int i=num.length()-1;i>=0;i--){
if(num[i]>='0'&&num[i]<='9') res+=((num[i]-'0')*pow(radix,num.length()-i-1));
else if(num[i]>='a'&&num[i]<='z') res+=((num[i]-'a'+10)*pow(radix,num.length()-i-1));
}
return res;
}