//注意数据中可能出现自环,即代码中的id可能最小取值到0,所以在判断连通性时下标需要从0开始!!!
#include <set>
#include <bitset>
#include <list>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <string>
#include <vector>
#include <ios>
#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <algorithm>
#include <utility>
#include <complex>
#include <numeric>
#include <functional>
#include <cmath>
#include <ctime>
#include <climits>
#include <cstdarg>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cassert>
using namespace std;
#define lson rt << 1, l, m
#define rson rt << 1 | 1, m + 1, r
const int INF = 0x7FFFFFFF;
const int MOD = 1e9 + 7;
const double EPS = 1e-10;
const double PI = 2 * acos (0.0);
const int maxn = 26;
const int nodemaxn = 500000 + 66;
int id, aacnt[nodemaxn], parent[nodemaxn];
struct Trie
{
int Next[nodemaxn][maxn], last[nodemaxn];
int len, root;
int newnode ()
{
for (int i = 0; i < maxn;i++)
Next[len][i] = -1;
last[len] = -1;
len++;
return len - 1;
}
void Init ()
{
len = 0;
root = newnode ();
}
void Insert (char *s, int vv)
{
int p = root;
for (int i = 0; s[i]; i++)
{
if (Next[p][s[i]-'a'] == -1)
Next[p][s[i]-'a'] = newnode ();
p = Next[p][s[i]-'a'];
}
last[p] = vv;
}
int Query (char *s)
{
// cout << s << endl;
int p = root;
for (int i = 0; s[i]; i++)
{
if (Next[p][s[i]-'a'] == -1)
return -1;
p = Next[p][s[i]-'a'];
}
if (last[p] != -1)
return last[p];
return -1;
}
};
Trie aa;
int UnFind (int val)
{
if (parent[val] == val)
return val;
return parent[val] = UnFind (parent[val]);
}
int main()
{
// ifstream cin("aaa.txt");
// freopen ("aaa.txt", "r", stdin);
char sa[66], sb[66];
aa.Init ();
id = 0;
memset (aacnt, 0, sizeof (aacnt));
for (int i = 0; i < nodemaxn; i++)
parent[i] = i;
int pp, va, vb;
while (scanf ("%s%s", sa, sb) != EOF)
{
pp = aa.Query (sa);
if (pp == -1)
{
aa.Insert (sa, id);
aacnt[id]++;
va = id;
id++;
}
else
{
aacnt[pp]++;
va = pp;
}
pp = aa.Query(sb);
if (pp == -1)
{
aa.Insert (sb, id);
aacnt[id]++;
vb = id;
id++;
}
else
{
aacnt[pp]++;
vb = pp;
}
if (UnFind (va) != UnFind (vb))
parent[UnFind(va)] = UnFind (vb);
}
// for (int i = 0; i < id; i++)
// cout << aacnt[i] << endl;
int odd = 0;
for (int i = 0; i < id; i++)
if (aacnt[i] & 1)
odd++;
bool is_valid = true;
int tt = UnFind (0);
for (int i = 0; i < id; i++)
if (UnFind (i) != tt)
{
is_valid = false;
break;
}
if ((odd == 0 || odd == 2) && is_valid)
puts ("Possible");
else
puts ("Impossible");
return 0;
}