#include // #include // #include // #include // #include // #include // using namespace atcoder; using namespace std; using ll = long long; using ull = unsigned long long; template using max_heap = priority_queue; template using min_heap = priority_queue, greater<>>; ll ll_min = numeric_limits::min(); ll ll_max = numeric_limits::max(); ll ALPHABET_N = 26; // using mint = modint998244353; #define rep(i, n) for (ll i = (ll)0; i < (ll)n; i++) #define rep_(i, k, n) for (ll i = (ll)k; i < (ll)n; i++) #define all(a) a.begin(), a.end() int main() { ios::sync_with_stdio(false); cin.tie(nullptr); ll n, m; cin >> n >> m; vector S(n); rep(i, n) cin >> S[i]; string ans = ""; bool win = true; set rests; rep(i, n) rests.insert(i); rep(i, m) { map> mp; for (ll j : rests) { mp[S[j][i]].push_back(j); } if (mp.size() == 0) { ans += 'G'; } else if (mp.size() == 1) { char c = mp.begin()->first; if (c == 'G') ans += 'P'; if (c == 'C') ans += 'G'; if (c == 'P') ans += 'C'; rests.clear(); } else if (mp.size() == 2) { set st_ = {mp.begin()->first, mp.rbegin()->first}; if (st_ == set({'P', 'G'})) { ans += 'P'; for (ll v : mp['G']) rests.erase(v); } if (st_ == set({'P', 'C'})) { ans += 'C'; for (ll v : mp['P']) rests.erase(v); } if (st_ == set({'G', 'C'})) { ans += 'G'; for (ll v : mp['C']) rests.erase(v); } } else { win = false; break; } } if (win && rests.empty()) cout << ans << endl; else cout << "-1" << endl; return 0; }