// 判断图是否联通 在连通的基础上还要判断是否存在欧拉通路
// 判断连通就并查集了 判断是否存在欧拉通路: 点度数为数的点 ==1 >=3就是不存在的 其它是存在的
// 我开始用 map 判重 然后就悲剧了一上午 好久没写 Trie树了 都忘了、
#include <iostream> #include <string> #include <map> #include <algorithm> #include <queue> #include <math.h> #include <stdio.h> #include <string.h> #include <vector> using namespace std; #define MOD 1000000007 #define maxn 500100 char s1[20],s2[20]; int d[maxn];//,out[maxn]; int f[maxn],num[maxn]; int Fin(int x){if(x!=f[x])f[x]=Fin(f[x]);return f[x]; } int sz; int ch[maxn][26]; int val[maxn]; int idx(char c){ return c-'a';} void insert(char *s,int v){int u=0;//,len=strlen(s);int c;for(int i=0;s[i]!='\0';i++){c=idx(s[i]);if(!ch[u][c]){memset(ch[sz],0,sizeof(ch[sz]));val[sz]=0;ch[u][c]=sz++;}u=ch[u][c];}// printf("%d-",v);val[u]=v; } int search(char *s){int u=0;//,len=strlen(s);int c;for(int i=0;s[i]!='\0';i++){c=idx(s[i]);// printf("c=%c",s[i]);if(!ch[u][c])return 0;u=ch[u][c];}return val[u]; } int main(){int i;int n=0;int u,v;for(i=1;i<=maxn;i++)f[i]=i,num[i]=1,d[i]=0;sz=1;memset(ch[0],0,sizeof(ch[0]));while(scanf("%s %s",s1,s2)!=EOF){if(u=search(s1)){d[u]++;}else{insert(s1,++n);u=n;d[u]++;}if(v=search(s2)){d[v]++;}else{insert(s2,++n);v=n;d[v]++;}//printf("%d %d\n",u,v);u=Fin(u);v=Fin(v);if(u!=v){if(num[u]>num[v]){f[v]=u;num[u]+=num[v];}else{f[u]=v;num[v]+=num[u];}}}int bf;bf=0;for(i=1;i<=n;i++)if(d[i]%2) bf++;if(bf==1||bf>2){ printf("Impossible\n");return 0;}bf=Fin(1);for(i=2;i<=n;i++)if(bf!=Fin(i)){printf("Impossible\n");return 0;}printf("Possible\n");return 0; }