#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 250005; char data[maxn][2][15]; int number = 0; int degree[maxn],num,ancestor[maxn]; struct Trie{ bool exist; int count; Trie*next[26]; Trie(){ exist = false; count = 0; memset(next,0,sizeof(next)); } }root; int find_ancestor(int x){ if(ancestor[x]!=x) ancestor[x] = find_ancestor(ancestor[x]); return ancestor[x]; } void union_set(int x,int y){ int px = find_ancestor(x); int py = find_ancestor(y); ancestor[px] = py; } int char2int(char*c){ int i,len=strlen(c); Trie*p = &root; for(i=0;i<len;i++){ if(p->next[c[i]-'a']==NULL){ p->next[c[i]-'a'] = new Trie; } p = p->next[c[i]-'a']; } if(p->exist==false){ p->exist = true; p->count = ++number; } return p->count; } int main(){ int i,kase = 1; bool flag; memset(degree,0,sizeof(degree)); for(i=1;i<maxn;i++){ ancestor[i] = i; } while(scanf("%s%s",data[kase][0],data[kase][1])==2){ int a = char2int(data[kase][0]); int b = char2int(data[kase][1]); degree[a]++; degree[b]++; union_set(a,b); kase++; } int s = find_ancestor(1); num = 0; flag = true; for(i=1;i<=number;i++){ if(degree[i]%2!=0)num++; if(num>2){ flag = false; break; } if(find_ancestor(i)!=s){ flag = false; break; } } if(flag&&num!=1) printf("Possible\n"); else printf("Impossible\n"); return 0; }