#include<iostream>
using namespace std;
//欧拉路径+并查集+字典树
//首先把这些颜色看成结点,同色相连,那么就形成了一幅图
//能够按题要求连接起来那么就是说每个棒即每条边走一次,这便是欧拉图
//对于欧拉图的判断,有两个,首先判断连通性,在连通性的前提下判断各节点的度数,有两个奇结点或者全偶
//并查集是将各节点归并到首节点,这样在查询时可以知道度数
//字典树用来给颜色赋编号
//把同种颜色的都汇在一个点上,那么由他们衍生出去的就是边,故从该中颜色的个数就可以知道该结点的度数,初始为0
int a[500001],b[500001];
void start()//初始化并查集
{
int i;
for(i=0;i<500001;i++)
{
a[i]=i;
b[i]=0;//起始该颜色个数都为0
}
}
int find(int x)
{
int r=x,p;
while(a[r]!=r)r=a[r];
while(r!=x)
{
p=a[x];a[x]=r;x=p;
}
return r;
}
void unit(int x,int y)
{
int t1=find(x),t2=find(y);
a[t2]=t1;//合并
}
typedef struct Trie
{
int id;//这个表示颜色的id
Trie *next[26];
};
Trie *s,*t,num[5000001];
int pos,id;
Trie head;
void build(Trie &head)
{
int i;
for(i=0;i<26;i++)
{
head.next[i]=0;
}
head.id=-1;
id=0;
}
int insert(char *b)
{
s=&head;
int i=0,j,k,len=strlen(b);
for(i=0;i<len;i++)
{
if(s->next[b[i]-'a']==NULL)break;
s=s->next[b[i]-'a'];
}
for(j=i;j<len;j++)
{
t=&num[pos++];
for(k=0;k<26;k++)
{
t->next[k]=0;
}
t->id=-1;
s->next[b[j]-'a']=t;
s=t;
}
if(s->id==-1)//获得该颜色的编号,如果还未赋值,那么就是之前的累加
{
s->id=id++;
}
return s->id;
}
bool liantong()//判断是否连通,如果连通那么从任意一点都课到达0点
{
int i,beg=find(0);
for(i=1;i<id;i++)
{
if(find(i)!=beg)return 0;
}
return 1;
}
bool oula()//判断是否为欧拉图
{
int count=0,i;
for(i=0;i<id;i++)
{
if(b[i]%2)count++;
}
if(count>2)return 0;
return 1;//两个奇数次点或全为偶数点
}
int main()
{
char s1[20],s2[20];
pos=0;
start();
build(head);
int x,y,fx,fy;
int c=0;
while(scanf("%s%s",s1,s2)!=EOF)
{
x=insert(s1);
y=insert(s2);
// cout<<"x="<<x<<" y="<<y<<endl;
b[x]++;
b[y]++;
// cout<<b[x]<<" "<<b[y]<<endl;
unit(x,y);
// c++;
// if(c==5)break;
}
if(liantong()==0)printf("Impossible\n");
else if(oula()==0)printf("Impossible\n");
else printf("Possible\n");
// system("pause");
return 0;
}