//这道题目是trie+欧拉回路+并查集
#include<iostream>
#include<cstdio>
using namespace std;
//第一道trie树,主要是数据结构
struct Node
{
bool flag;//标记是否是单词
int id;//第几个词
Node *p[26];//26个分支
}*root;//根节点
int cnt;
int degree[500001],f[500001];
int GetNum(char *s)//获得单词的标号
{
Node *r=root;
Node *temp;
for(int i=0;i<strlen(s);i++)
{
if(r->p[s[i]-'a']==NULL)//
{
temp=new Node;
temp->flag=false;
temp->id=-1;//不是单词
for(int j=0;j<26;j++)
temp->p[j]=NULL;
r->p[s[i]-'a']=temp;//下一个节点
}
r=r->p[s[i]-'a'];//指向下一个字母
}
if(r->flag==true)//如果是一个单词,也就是单词已经存在
return r->id;
r->flag=true;//如果不存在
r->id=cnt++;
return r->id;
}
//并查集
int Find(int x)
{
if(x!=f[x])
return f[x]=Find(f[x]);
return f[x];
}
//这个地方有点诡异
void Union(int x,int y)
{
f[Find(x)]=f[Find(y)];
}
int main()
{
char s1[15],s2[15];
int x,y,i,j;
int num=0;
root=new Node;//初始化根节点
root->flag=false;
root->id=0;//第0个单词
cnt=1;
for(j=0;j<26;j++)
root->p[j]=NULL;
for(i=0;i<500001;i++)//并查集初始化
{
degree[i]=0;
f[i]=i;
}
while(scanf("%s %s",s1,s2)!=EOF)
{
x=GetNum(s1);
y=GetNum(s2);
degree[x]++;
degree[y]++;
Union(x,y);
}
for(i=0;i<cnt;i++)//
{
if(degree[i]%2!=0)
num++;
}
x=Find(1);
for(i=2;i<cnt;i++)//判断是否连通
{
if(x!=Find(i))
{
num=-1;
break;
}
}
if(num==2||num==0)//欧拉回路
printf("Possible/n");
else
printf("Impossible/n");
return 0;
}