#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;
}