#include<bits/stdc++.h>
using namespace std;
string n1,n2;
int tag,radix;
long long Map[256];
long long getnum(string s, int radix) {
long long ans=0;
for (int i=0; i<s.length(); i++) {
ans=ans*radix+Map[s[i]];
if(ans<0)
return -1;
}
return ans;
}
long long getlow(string s) {
long long maxnum=0;
for (int i=0; i<s.length(); i++)
if (Map[s[i]]>maxnum)maxnum=Map[s[i]];
return maxnum+1;
}
long long Binary(long long low,long long high,string s,long long number) {
while (low<high) {
long long mid=(low+high)/2;
long long result=getnum(s,mid);
if (result>number||result==-1)
high=mid;
else if(result<number)
low=mid;
else if(result==number)
return mid;
}
return -1;
}
void init() {
for (char c ='0'; c<='9'; c++)
Map[c]=c-'0';
for (char c='a'; c<='z'; c++)
Map[c]=c-'a'+10;
}
int main() {
init();
cin>>n1>>n2>>tag>>radix;
if(tag==2)
swap(n1,n2);
long long number1=getnum(n1,radix),low=getlow(n2),high=max(number1,low)+1,ans=Binary(low, high, n2, number1);
if (ans!=-1)
printf("%d",ans);
else
printf("Impossible");
return 0;
}