#include using namespace std; // 変化位置の近傍だけを見て、局所的に危険そうなら true bool locally_dangerous(const string& s, int l, int r) { int n = (int)s.size(); // 変化した範囲の少し周辺だけ見る int L = max(0, l - 3); int R = min(n - 1, r + 3); for (int i = L; i <= R; i++) { // g の左に d がある場合だけ危険視 // ここでは「すぐ左」だけ見る if (s[i] == 'g') { if (i - 1 >= 0 && s[i - 1] == 'd') { return true; } } // d の右に g がある場合だけ危険視 // ここでは「すぐ右」だけ見る if (s[i] == 'd') { if (i + 1 < n && s[i + 1] == 'g') { return true; } } } return false; } // good -> dog bool apply_good_to_dog(string& s) { int n = (int)s.size(); for (int i = 0; i + 4 <= n; i++) { if (s.substr(i, 4) != "good") continue; string t = s; t.replace(i, 4, "dog"); // good[4] -> dog[3] なので、変化後の範囲は i..i+2 あたり if (locally_dangerous(t, i, i + 2)) { continue; } s = t; return true; } return false; } // dog -> good bool apply_dog_to_good(string& s) { int n = (int)s.size(); for (int i = 0; i + 3 <= n; i++) { if (s.substr(i, 3) != "dog") continue; string t = s; t.replace(i, 3, "good"); // dog[3] -> good[4] なので、変化後の範囲は i..i+3 あたり if (locally_dangerous(t, i, i + 3)) { continue; } s = t; return true; } return false; } // 嘘貪欲: // 左から見て、局所的に危険でなければ操作する。 // good -> dog を優先し、無理なら dog -> good を試す。 string fake_solve(string s, int limit = 100000) { for (int step = 0; step < limit; step++) { bool changed = false; if (apply_good_to_dog(s)) { changed = true; } else if (apply_dog_to_good(s)) { changed = true; } if (!changed) break; } return s; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); string S; cin >> S; string ans = fake_solve(S); cout << ans << '\n'; return 0; }