/*
 * 英小文字からなる文字列 S が与えられます。 Tが空文字列である状態から始め、以下の操作を好きな回数繰り返すことで S=T とすることができるか判定してください。
 * 
 *    T の末尾に dream dreamer erase eraser のいずれかを追加する。
 */

import java.util.*;
	public class Main{
        public static void main(String[] args){
            Scanner sc = new Scanner(System.in);
            // 入力を一文字ずつにする
            sc.useDelimiter("");
            // 10文字読み込む
            String s = sc.next();
            s = getString(s, 9, sc);
            
            // 改行文字だけになるまで続ける
            while(s.length() > 1){
            	// eraserが先頭にあるならそれを消し、10文字になるまで読み込む
            	if(s.length() >=6 && s.substring(0, 6).equals("eraser")){
            		s = s.substring(6);
            		s = getString(s, 6, sc);
            	// eraseが先頭にあるならそれを消し、10文字になるまで読み込む、dreamが先頭にある、かつdreamerが先頭にないならdreamを消し、10文字になるまで読み込む、dreameraseが先頭にあるならdreamを消し、10文字になるまで読み込む
            	}else if((s.length() >=5 && s.substring(0, 5).equals("erase")) || (s.length() >=6 && s.substring(0, 5).equals("dream") && !s.substring(0, 6).equals("dreame")) || (s.length() >=10 && s.substring(0, 10).equals("dreamerase"))){
            		s = s.substring(5);
            		s = getString(s, 5, sc);
            	// 残りが、(dreamまたはdreamer) + 改行文字ならばおしまい
            	}else if((s.length() == 6 && s.substring(0, 5).equals("dream")) || (s.length() == 8 && s.substring(0, 7).equals("dreamer"))){
            		s = "";
            	// dreamerが先頭にある、かつdreameraseが先頭にないならdreamerを消し、10文字になるまで読み込む
            	}else if(s.length() >=10 && s.substring(0, 7).equals("dreamer") && !s.substring(0, 10).equals("dreamerase")){
            		s = s.substring(7);
            		s = getString(s, 7, sc);
            	// それ以外なら題の操作では生成できない文字列なのでNOを出力してreturn
            	}else{
            		System.out.println("NO");
                    sc.close();
                    return;
            	}
            }
            
            // 改行文字だけになったら題の操作で生成できるということなのでYESを出力
            System.out.println("YES");
            sc.close();
        }
        
        // n文字分入力を読み取ってsに追加する関数getString
        public static String getString(String s, int n, Scanner sc){
        	// 改行文字を読みとったらもうそれ以上は読み込まない
        	if(!s.substring(s.length()-1).equals("\n")){
        		for(int i=0; i<n && !s.substring(s.length()-1).equals("\n"); i++){
        			s += sc.next();
        		}
        	}
            
            return s;
        }
    }
	 import java.util.*; util.* java public class Main{
        public static void main(String[] args){
            Scanner sc = new Scanner(System.in);
            // 入力を一文字ずつにする
            sc.useDelimiter("");
            // 10文字読み込む
            String s = sc.next();
            s = getString(s, 9, sc);
            
            // 改行文字だけになるまで続ける
            while(s.length() > 1){
            	// eraserが先頭にあるならそれを消し、10文字になるまで読み込む
            	if(s.length() >=6 && s.substring(0, 6).equals("eraser")){
            		s = s.substring(6);
            		s = getString(s, 6, sc);
            	// eraseが先頭にあるならそれを消し、10文字になるまで読み込む、dreamが先頭にある、かつdreamerが先頭にないならdreamを消し、10文字になるまで読み込む、dreameraseが先頭にあるならdreamを消し、10文字になるまで読み込む
            	}else if((s.length() >=5 && s.substring(0, 5).equals("erase")) || (s.length() >=6 && s.substring(0, 5).equals("dream") && !s.substring(0, 6).equals("dreame")) || (s.length() >=10 && s.substring(0, 10).equals("dreamerase"))){
            		s = s.substring(5);
            		s = getString(s, 5, sc);
            	// 残りが、(dreamまたはdreamer) + 改行文字ならばおしまい
            	}else if((s.length() == 6 && s.substring(0, 5).equals("dream")) || (s.length() == 8 && s.substring(0, 7).equals("dreamer"))){
            		s = "";
            	// dreamerが先頭にある、かつdreameraseが先頭にないならdreamerを消し、10文字になるまで読み込む
            	}else if(s.length() >=10 && s.substring(0, 7).equals("dreamer") && !s.substring(0, 10).equals("dreamerase")){
            		s = s.substring(7);
            		s = getString(s, 7, sc);
            	// それ以外なら題の操作では生成できない文字列なのでNOを出力してreturn
            	}else{
            		System.out.println("NO");
                    sc.close();
                    return;
            	}
            }
            
            // 改行文字だけになったら題の操作で生成できるということなのでYESを出力
            System.out.println("YES");
            sc.close();
        }
        
        // n文字分入力を読み取ってsに追加する関数getString
        public static String getString(String s, int n, Scanner sc){
        	// 改行文字を読みとったらもうそれ以上は読み込まない
        	if(!s.substring(s.length()-1).equals("\n")){
        		for(int i=0; i<n && !s.substring(s.length()-1).equals("\n"); i++){
        			s += sc.next();
        		}
        	}
            
            return s;
        }
    } Main public static void main(String[] args){
            Scanner sc = new Scanner(System.in);
            // 入力を一文字ずつにする
            sc.useDelimiter("");
            // 10文字読み込む
            String s = sc.next();
            s = getString(s, 9, sc);
            
            // 改行文字だけになるまで続ける
            while(s.length() > 1){
            	// eraserが先頭にあるならそれを消し、10文字になるまで読み込む
            	if(s.length() >=6 && s.substring(0, 6).equals("eraser")){
            		s = s.substring(6);
            		s = getString(s, 6, sc);
            	// eraseが先頭にあるならそれを消し、10文字になるまで読み込む、dreamが先頭にある、かつdreamerが先頭にないならdreamを消し、10文字になるまで読み込む、dreameraseが先頭にあるならdreamを消し、10文字になるまで読み込む
            	}else if((s.length() >=5 && s.substring(0, 5).equals("erase")) || (s.length() >=6 && s.substring(0, 5).equals("dream") && !s.substring(0, 6).equals("dreame")) || (s.length() >=10 && s.substring(0, 10).equals("dreamerase"))){
            		s = s.substring(5);
            		s = getString(s, 5, sc);
            	// 残りが、(dreamまたはdreamer) + 改行文字ならばおしまい
            	}else if((s.length() == 6 && s.substring(0, 5).equals("dream")) || (s.length() == 8 && s.substring(0, 7).equals("dreamer"))){
            		s = "";
            	// dreamerが先頭にある、かつdreameraseが先頭にないならdreamerを消し、10文字になるまで読み込む
            	}else if(s.length() >=10 && s.substring(0, 7).equals("dreamer") && !s.substring(0, 10).equals("dreamerase")){
            		s = s.substring(7);
            		s = getString(s, 7, sc);
            	// それ以外なら題の操作では生成できない文字列なのでNOを出力してreturn
            	}else{
            		System.out.println("NO");
                    sc.close();
                    return;
            	}
            }
            
            // 改行文字だけになったら題の操作で生成できるということなのでYESを出力
            System.out.println("YES");
            sc.close();
        } main {
            Scanner sc = new Scanner(System.in);
            // 入力を一文字ずつにする
            sc.useDelimiter("");
            // 10文字読み込む
            String s = sc.next();
            s = getString(s, 9, sc);
            
            // 改行文字だけになるまで続ける
            while(s.length() > 1){
            	// eraserが先頭にあるならそれを消し、10文字になるまで読み込む
            	if(s.length() >=6 && s.substring(0, 6).equals("eraser")){
            		s = s.substring(6);
            		s = getString(s, 6, sc);
            	// eraseが先頭にあるならそれを消し、10文字になるまで読み込む、dreamが先頭にある、かつdreamerが先頭にないならdreamを消し、10文字になるまで読み込む、dreameraseが先頭にあるならdreamを消し、10文字になるまで読み込む
            	}else if((s.length() >=5 && s.substring(0, 5).equals("erase")) || (s.length() >=6 && s.substring(0, 5).equals("dream") && !s.substring(0, 6).equals("dreame")) || (s.length() >=10 && s.substring(0, 10).equals("dreamerase"))){
            		s = s.substring(5);
            		s = getString(s, 5, sc);
            	// 残りが、(dreamまたはdreamer) + 改行文字ならばおしまい
            	}else if((s.length() == 6 && s.substring(0, 5).equals("dream")) || (s.length() == 8 && s.substring(0, 7).equals("dreamer"))){
            		s = "";
            	// dreamerが先頭にある、かつdreameraseが先頭にないならdreamerを消し、10文字になるまで読み込む
            	}else if(s.length() >=10 && s.substring(0, 7).equals("dreamer") && !s.substring(0, 10).equals("dreamerase")){
            		s = s.substring(7);
            		s = getString(s, 7, sc);
            	// それ以外なら題の操作では生成できない文字列なのでNOを出力してreturn
            	}else{
            		System.out.println("NO");
                    sc.close();
                    return;
            	}
            }
            
            // 改行文字だけになったら題の操作で生成できるということなのでYESを出力
            System.out.println("YES");
            sc.close();
        } Scanner sc = new Scanner(System.in); sc new Scanner(System.in) sc.useDelimiter("") sc.useDelimiter sc "" String s = sc.next(); s sc.next() sc.next sc s = getString(s, 9, sc) s getString(s, 9, sc) getString s 9 sc while(s.length() > 1){
            	// eraserが先頭にあるならそれを消し、10文字になるまで読み込む
            	if(s.length() >=6 && s.substring(0, 6).equals("eraser")){
            		s = s.substring(6);
            		s = getString(s, 6, sc);
            	// eraseが先頭にあるならそれを消し、10文字になるまで読み込む、dreamが先頭にある、かつdreamerが先頭にないならdreamを消し、10文字になるまで読み込む、dreameraseが先頭にあるならdreamを消し、10文字になるまで読み込む
            	}else if((s.length() >=5 && s.substring(0, 5).equals("erase")) || (s.length() >=6 && s.substring(0, 5).equals("dream") && !s.substring(0, 6).equals("dreame")) || (s.length() >=10 && s.substring(0, 10).equals("dreamerase"))){
            		s = s.substring(5);
            		s = getString(s, 5, sc);
            	// 残りが、(dreamまたはdreamer) + 改行文字ならばおしまい
            	}else if((s.length() == 6 && s.substring(0, 5).equals("dream")) || (s.length() == 8 && s.substring(0, 7).equals("dreamer"))){
            		s = "";
            	// dreamerが先頭にある、かつdreameraseが先頭にないならdreamerを消し、10文字になるまで読み込む
            	}else if(s.length() >=10 && s.substring(0, 7).equals("dreamer") && !s.substring(0, 10).equals("dreamerase")){
            		s = s.substring(7);
            		s = getString(s, 7, sc);
            	// それ以外なら題の操作では生成できない文字列なのでNOを出力してreturn
            	}else{
            		System.out.println("NO");
                    sc.close();
                    return;
            	}
            } s.length() > 1 s.length() s.length s 1 {
            	// eraserが先頭にあるならそれを消し、10文字になるまで読み込む
            	if(s.length() >=6 && s.substring(0, 6).equals("eraser")){
            		s = s.substring(6);
            		s = getString(s, 6, sc);
            	// eraseが先頭にあるならそれを消し、10文字になるまで読み込む、dreamが先頭にある、かつdreamerが先頭にないならdreamを消し、10文字になるまで読み込む、dreameraseが先頭にあるならdreamを消し、10文字になるまで読み込む
            	}else if((s.length() >=5 && s.substring(0, 5).equals("erase")) || (s.length() >=6 && s.substring(0, 5).equals("dream") && !s.substring(0, 6).equals("dreame")) || (s.length() >=10 && s.substring(0, 10).equals("dreamerase"))){
            		s = s.substring(5);
            		s = getString(s, 5, sc);
            	// 残りが、(dreamまたはdreamer) + 改行文字ならばおしまい
            	}else if((s.length() == 6 && s.substring(0, 5).equals("dream")) || (s.length() == 8 && s.substring(0, 7).equals("dreamer"))){
            		s = "";
            	// dreamerが先頭にある、かつdreameraseが先頭にないならdreamerを消し、10文字になるまで読み込む
            	}else if(s.length() >=10 && s.substring(0, 7).equals("dreamer") && !s.substring(0, 10).equals("dreamerase")){
            		s = s.substring(7);
            		s = getString(s, 7, sc);
            	// それ以外なら題の操作では生成できない文字列なのでNOを出力してreturn
            	}else{
            		System.out.println("NO");
                    sc.close();
                    return;
            	}
            } if(s.length() >=6 && s.substring(0, 6).equals("eraser")){
            		s = s.substring(6);
            		s = getString(s, 6, sc);
            	// eraseが先頭にあるならそれを消し、10文字になるまで読み込む、dreamが先頭にある、かつdreamerが先頭にないならdreamを消し、10文字になるまで読み込む、dreameraseが先頭にあるならdreamを消し、10文字になるまで読み込む
            	}else if((s.length() >=5 && s.substring(0, 5).equals("erase")) || (s.length() >=6 && s.substring(0, 5).equals("dream") && !s.substring(0, 6).equals("dreame")) || (s.length() >=10 && s.substring(0, 10).equals("dreamerase"))){
            		s = s.substring(5);
            		s = getString(s, 5, sc);
            	// 残りが、(dreamまたはdreamer) + 改行文字ならばおしまい
            	}else if((s.length() == 6 && s.substring(0, 5).equals("dream")) || (s.length() == 8 && s.substring(0, 7).equals("dreamer"))){
            		s = "";
            	// dreamerが先頭にある、かつdreameraseが先頭にないならdreamerを消し、10文字になるまで読み込む
            	}else if(s.length() >=10 && s.substring(0, 7).equals("dreamer") && !s.substring(0, 10).equals("dreamerase")){
            		s = s.substring(7);
            		s = getString(s, 7, sc);
            	// それ以外なら題の操作では生成できない文字列なのでNOを出力してreturn
            	}else{
            		System.out.println("NO");
                    sc.close();
                    return;
            	} s.length() >=6 && s.substring(0, 6).equals("eraser") s.length() >=6 s.length() s.length s 6 s.substring(0, 6).equals("eraser") s.substring(0, 6).equals s.substring(0, 6) s.substring s 0 6 "eraser" {
            		s = s.substring(6);
            		s = getString(s, 6, sc);
            	// eraseが先頭にあるならそれを消し、10文字になるまで読み込む、dreamが先頭にある、かつdreamerが先頭にないならdreamを消し、10文字になるまで読み込む、dreameraseが先頭にあるならdreamを消し、10文字になるまで読み込む
            	} s = s.substring(6) s s.substring(6) s.substring s 6 s = getString(s, 6, sc) s getString(s, 6, sc) getString s 6 sc if((s.length() >=5 && s.substring(0, 5).equals("erase")) || (s.length() >=6 && s.substring(0, 5).equals("dream") && !s.substring(0, 6).equals("dreame")) || (s.length() >=10 && s.substring(0, 10).equals("dreamerase"))){
            		s = s.substring(5);
            		s = getString(s, 5, sc);
            	// 残りが、(dreamまたはdreamer) + 改行文字ならばおしまい
            	}else if((s.length() == 6 && s.substring(0, 5).equals("dream")) || (s.length() == 8 && s.substring(0, 7).equals("dreamer"))){
            		s = "";
            	// dreamerが先頭にある、かつdreameraseが先頭にないならdreamerを消し、10文字になるまで読み込む
            	}else if(s.length() >=10 && s.substring(0, 7).equals("dreamer") && !s.substring(0, 10).equals("dreamerase")){
            		s = s.substring(7);
            		s = getString(s, 7, sc);
            	// それ以外なら題の操作では生成できない文字列なのでNOを出力してreturn
            	}else{
            		System.out.println("NO");
                    sc.close();
                    return;
            	} (s.length() >=5 && s.substring(0, 5).equals("erase")) || (s.length() >=6 && s.substring(0, 5).equals("dream") && !s.substring(0, 6).equals("dreame")) || (s.length() >=10 && s.substring(0, 10).equals("dreamerase")) (s.length() >=5 && s.substring(0, 5).equals("erase")) || (s.length() >=6 && s.substring(0, 5).equals("dream") && !s.substring(0, 6).equals("dreame")) || (s.length() >=10 && s.substring(0, 10).equals("dreamerase")) (s.length() >=5 && s.substring(0, 5).equals("erase")) s.length() >=5 s.length() s.length s 5 s.substring(0, 5).equals("erase") s.substring(0, 5).equals s.substring(0, 5) s.substring s 0 5 "erase" (s.length() >=6 && s.substring(0, 5).equals("dream") && !s.substring(0, 6).equals("dreame")) s.length() >=6 && s.substring(0, 5).equals("dream") && !s.substring(0, 6).equals("dreame") s.length() >=6 s.length() s.length s 6 s.substring(0, 5).equals("dream") s.substring(0, 5).equals s.substring(0, 5) s.substring s 0 5 "dream" !s.substring(0, 6).equals("dreame") s.substring(0, 6).equals("dreame") s.substring(0, 6).equals s.substring(0, 6) s.substring s 0 6 "dreame" (s.length() >=10 && s.substring(0, 10).equals("dreamerase")) s.length() >=10 s.length() s.length s 10 s.substring(0, 10).equals("dreamerase") s.substring(0, 10).equals s.substring(0, 10) s.substring s 0 10 "dreamerase" {
            		s = s.substring(5);
            		s = getString(s, 5, sc);
            	// 残りが、(dreamまたはdreamer) + 改行文字ならばおしまい
            	} s = s.substring(5) s s.substring(5) s.substring s 5 s = getString(s, 5, sc) s getString(s, 5, sc) getString s 5 sc if((s.length() == 6 && s.substring(0, 5).equals("dream")) || (s.length() == 8 && s.substring(0, 7).equals("dreamer"))){
            		s = "";
            	// dreamerが先頭にある、かつdreameraseが先頭にないならdreamerを消し、10文字になるまで読み込む
            	}else if(s.length() >=10 && s.substring(0, 7).equals("dreamer") && !s.substring(0, 10).equals("dreamerase")){
            		s = s.substring(7);
            		s = getString(s, 7, sc);
            	// それ以外なら題の操作では生成できない文字列なのでNOを出力してreturn
            	}else{
            		System.out.println("NO");
                    sc.close();
                    return;
            	} (s.length() == 6 && s.substring(0, 5).equals("dream")) || (s.length() == 8 && s.substring(0, 7).equals("dreamer")) (s.length() == 6 && s.substring(0, 5).equals("dream")) s.length() == 6 s.length() s.length s 6 s.substring(0, 5).equals("dream") s.substring(0, 5).equals s.substring(0, 5) s.substring s 0 5 "dream" (s.length() == 8 && s.substring(0, 7).equals("dreamer")) s.length() == 8 s.length() s.length s 8 s.substring(0, 7).equals("dreamer") s.substring(0, 7).equals s.substring(0, 7) s.substring s 0 7 "dreamer" {
            		s = "";
            	// dreamerが先頭にある、かつdreameraseが先頭にないならdreamerを消し、10文字になるまで読み込む
            	} s = "" s "" if(s.length() >=10 && s.substring(0, 7).equals("dreamer") && !s.substring(0, 10).equals("dreamerase")){
            		s = s.substring(7);
            		s = getString(s, 7, sc);
            	// それ以外なら題の操作では生成できない文字列なのでNOを出力してreturn
            	}else{
            		System.out.println("NO");
                    sc.close();
                    return;
            	} s.length() >=10 && s.substring(0, 7).equals("dreamer") && !s.substring(0, 10).equals("dreamerase") s.length() >=10 && s.substring(0, 7).equals("dreamer") && !s.substring(0, 10).equals("dreamerase") s.length() >=10 s.length() s.length s 10 s.substring(0, 7).equals("dreamer") s.substring(0, 7).equals s.substring(0, 7) s.substring s 0 7 "dreamer" !s.substring(0, 10).equals("dreamerase") s.substring(0, 10).equals("dreamerase") s.substring(0, 10).equals s.substring(0, 10) s.substring s 0 10 "dreamerase" {
            		s = s.substring(7);
            		s = getString(s, 7, sc);
            	// それ以外なら題の操作では生成できない文字列なのでNOを出力してreturn
            	} s = s.substring(7) s s.substring(7) s.substring s 7 s = getString(s, 7, sc) s getString(s, 7, sc) getString s 7 sc {
            		System.out.println("NO");
                    sc.close();
                    return;
            	} System.out.println("NO") System.out.println System.out System System.out "NO" sc.close() sc.close sc return; System.out.println("YES") System.out.println System.out System System.out "YES" sc.close() sc.close sc String[] args args // n文字分入力を読み取ってsに追加する関数getString
        public static String getString(String s, int n, Scanner sc){
        	// 改行文字を読みとったらもうそれ以上は読み込まない
        	if(!s.substring(s.length()-1).equals("\n")){
        		for(int i=0; i<n && !s.substring(s.length()-1).equals("\n"); i++){
        			s += sc.next();
        		}
        	}
            
            return s;
        } getString {
        	// 改行文字を読みとったらもうそれ以上は読み込まない
        	if(!s.substring(s.length()-1).equals("\n")){
        		for(int i=0; i<n && !s.substring(s.length()-1).equals("\n"); i++){
        			s += sc.next();
        		}
        	}
            
            return s;
        } if(!s.substring(s.length()-1).equals("\n")){
        		for(int i=0; i<n && !s.substring(s.length()-1).equals("\n"); i++){
        			s += sc.next();
        		}
        	} !s.substring(s.length()-1).equals("\n") s.substring(s.length()-1).equals("\n") s.substring(s.length()-1).equals s.substring(s.length()-1) s.substring s s.length()-1 s.length() s.length s 1 "\n" {
        		for(int i=0; i<n && !s.substring(s.length()-1).equals("\n"); i++){
        			s += sc.next();
        		}
        	} for(int i=0; i<n && !s.substring(s.length()-1).equals("\n"); i++){
        			s += sc.next();
        		} int i=0; int i=0; i 0 i<n && !s.substring(s.length()-1).equals("\n") i<n i n !s.substring(s.length()-1).equals("\n") s.substring(s.length()-1).equals("\n") s.substring(s.length()-1).equals s.substring(s.length()-1) s.substring s s.length()-1 s.length() s.length s 1 "\n" i++ i++ i {
        			s += sc.next();
        		} {
        			s += sc.next();
        		} s += sc.next() s sc.next() sc.next sc return s; s String s s int n n Scanner sc sc public class Main{
        public static void main(String[] args){
            Scanner sc = new Scanner(System.in);
            // 入力を一文字ずつにする
            sc.useDelimiter("");
            // 10文字読み込む
            String s = sc.next();
            s = getString(s, 9, sc);
            
            // 改行文字だけになるまで続ける
            while(s.length() > 1){
            	// eraserが先頭にあるならそれを消し、10文字になるまで読み込む
            	if(s.length() >=6 && s.substring(0, 6).equals("eraser")){
            		s = s.substring(6);
            		s = getString(s, 6, sc);
            	// eraseが先頭にあるならそれを消し、10文字になるまで読み込む、dreamが先頭にある、かつdreamerが先頭にないならdreamを消し、10文字になるまで読み込む、dreameraseが先頭にあるならdreamを消し、10文字になるまで読み込む
            	}else if((s.length() >=5 && s.substring(0, 5).equals("erase")) || (s.length() >=6 && s.substring(0, 5).equals("dream") && !s.substring(0, 6).equals("dreame")) || (s.length() >=10 && s.substring(0, 10).equals("dreamerase"))){
            		s = s.substring(5);
            		s = getString(s, 5, sc);
            	// 残りが、(dreamまたはdreamer) + 改行文字ならばおしまい
            	}else if((s.length() == 6 && s.substring(0, 5).equals("dream")) || (s.length() == 8 && s.substring(0, 7).equals("dreamer"))){
            		s = "";
            	// dreamerが先頭にある、かつdreameraseが先頭にないならdreamerを消し、10文字になるまで読み込む
            	}else if(s.length() >=10 && s.substring(0, 7).equals("dreamer") && !s.substring(0, 10).equals("dreamerase")){
            		s = s.substring(7);
            		s = getString(s, 7, sc);
            	// それ以外なら題の操作では生成できない文字列なのでNOを出力してreturn
            	}else{
            		System.out.println("NO");
                    sc.close();
                    return;
            	}
            }
            
            // 改行文字だけになったら題の操作で生成できるということなのでYESを出力
            System.out.println("YES");
            sc.close();
        }
        
        // n文字分入力を読み取ってsに追加する関数getString
        public static String getString(String s, int n, Scanner sc){
        	// 改行文字を読みとったらもうそれ以上は読み込まない
        	if(!s.substring(s.length()-1).equals("\n")){
        		for(int i=0; i<n && !s.substring(s.length()-1).equals("\n"); i++){
        			s += sc.next();
        		}
        	}
            
            return s;
        }
    } public class Main{
        public static void main(String[] args){
            Scanner sc = new Scanner(System.in);
            // 入力を一文字ずつにする
            sc.useDelimiter("");
            // 10文字読み込む
            String s = sc.next();
            s = getString(s, 9, sc);
            
            // 改行文字だけになるまで続ける
            while(s.length() > 1){
            	// eraserが先頭にあるならそれを消し、10文字になるまで読み込む
            	if(s.length() >=6 && s.substring(0, 6).equals("eraser")){
            		s = s.substring(6);
            		s = getString(s, 6, sc);
            	// eraseが先頭にあるならそれを消し、10文字になるまで読み込む、dreamが先頭にある、かつdreamerが先頭にないならdreamを消し、10文字になるまで読み込む、dreameraseが先頭にあるならdreamを消し、10文字になるまで読み込む
            	}else if((s.length() >=5 && s.substring(0, 5).equals("erase")) || (s.length() >=6 && s.substring(0, 5).equals("dream") && !s.substring(0, 6).equals("dreame")) || (s.length() >=10 && s.substring(0, 10).equals("dreamerase"))){
            		s = s.substring(5);
            		s = getString(s, 5, sc);
            	// 残りが、(dreamまたはdreamer) + 改行文字ならばおしまい
            	}else if((s.length() == 6 && s.substring(0, 5).equals("dream")) || (s.length() == 8 && s.substring(0, 7).equals("dreamer"))){
            		s = "";
            	// dreamerが先頭にある、かつdreameraseが先頭にないならdreamerを消し、10文字になるまで読み込む
            	}else if(s.length() >=10 && s.substring(0, 7).equals("dreamer") && !s.substring(0, 10).equals("dreamerase")){
            		s = s.substring(7);
            		s = getString(s, 7, sc);
            	// それ以外なら題の操作では生成できない文字列なのでNOを出力してreturn
            	}else{
            		System.out.println("NO");
                    sc.close();
                    return;
            	}
            }
            
            // 改行文字だけになったら題の操作で生成できるということなのでYESを出力
            System.out.println("YES");
            sc.close();
        }
        
        // n文字分入力を読み取ってsに追加する関数getString
        public static String getString(String s, int n, Scanner sc){
        	// 改行文字を読みとったらもうそれ以上は読み込まない
        	if(!s.substring(s.length()-1).equals("\n")){
        		for(int i=0; i<n && !s.substring(s.length()-1).equals("\n"); i++){
        			s += sc.next();
        		}
        	}
            
            return s;
        }
    } Main
/*
 * 英小文字からなる文字列 S が与えられます。 Tが空文字列である状態から始め、以下の操作を好きな回数繰り返すことで S=T とすることができるか判定してください。
 * 
 *    T の末尾に dream dreamer erase eraser のいずれかを追加する。
 */

import java.util.*;
	public class Main{
        public static void main(String[] args){
            Scanner sc = new Scanner(System.in);
            // 入力を一文字ずつにする
            sc.useDelimiter("");
            // 10文字読み込む
            String s = sc.next();
            s = getString(s, 9, sc);
            
            // 改行文字だけになるまで続ける
            while(s.length() > 1){
            	// eraserが先頭にあるならそれを消し、10文字になるまで読み込む
            	if(s.length() >=6 && s.substring(0, 6).equals("eraser")){
            		s = s.substring(6);
            		s = getString(s, 6, sc);
            	// eraseが先頭にあるならそれを消し、10文字になるまで読み込む、dreamが先頭にある、かつdreamerが先頭にないならdreamを消し、10文字になるまで読み込む、dreameraseが先頭にあるならdreamを消し、10文字になるまで読み込む
            	}else if((s.length() >=5 && s.substring(0, 5).equals("erase")) || (s.length() >=6 && s.substring(0, 5).equals("dream") && !s.substring(0, 6).equals("dreame")) || (s.length() >=10 && s.substring(0, 10).equals("dreamerase"))){
            		s = s.substring(5);
            		s = getString(s, 5, sc);
            	// 残りが、(dreamまたはdreamer) + 改行文字ならばおしまい
            	}else if((s.length() == 6 && s.substring(0, 5).equals("dream")) || (s.length() == 8 && s.substring(0, 7).equals("dreamer"))){
            		s = "";
            	// dreamerが先頭にある、かつdreameraseが先頭にないならdreamerを消し、10文字になるまで読み込む
            	}else if(s.length() >=10 && s.substring(0, 7).equals("dreamer") && !s.substring(0, 10).equals("dreamerase")){
            		s = s.substring(7);
            		s = getString(s, 7, sc);
            	// それ以外なら題の操作では生成できない文字列なのでNOを出力してreturn
            	}else{
            		System.out.println("NO");
                    sc.close();
                    return;
            	}
            }
            
            // 改行文字だけになったら題の操作で生成できるということなのでYESを出力
            System.out.println("YES");
            sc.close();
        }
        
        // n文字分入力を読み取ってsに追加する関数getString
        public static String getString(String s, int n, Scanner sc){
        	// 改行文字を読みとったらもうそれ以上は読み込まない
        	if(!s.substring(s.length()-1).equals("\n")){
        		for(int i=0; i<n && !s.substring(s.length()-1).equals("\n"); i++){
        			s += sc.next();
        		}
        	}
            
            return s;
        }
    }
	