#define SHORTCUT
#define VECTOR

#include <algorithm>
//#include <cmath>
//#include <ctime>
//#include <iomanip>
#include <iostream>
//#include <map>
//#include <math.h>
//#include <queue>//待ち行列　queue<TYPE> q(SIZE); q.push(TYPE); q.pop(TYPE); q.front(); q.back();
//#include <set>
//#include <stack>//積ん読　stack<TYPE> s(SIZE); s.push(TYPE); s.pop(TYPE); s.top();
//#include <stdio.h>
#include <string>
//#include <tuple>
#include <vector>//sort法  昇順 std::sort(v.begin(),v.end()); 降順 std::sort(v.begin(),v.end(),std::greater<int>());

#ifdef SHORTCUT
#define REP(i,f,t) for(int i=f-(f<t?0:1); ((f<t?f:t) <= i && i < (f<t?t:f)); i+=(f<t?1:-1))
#define REP1(i,f,t) REP(i,f+(f<t?0:1),t+(f<t?1:0))
#define rep(i,t) REP(i,0,t)
#define rep1(i,t) REP1(i,0,t)   

#define pInt std::pair<int ,int>
#define vInt std::vector<int>
#define vPairInt std::vector<pInt>
#define fr first
#define sc second
#define pubk push_back
#define pobk pop_back

#ifdef VECTOR
template<typename T> void cinV(std::vector< T > &v, const int size) { T tmp; rep(i, size) { std::cin >> tmp; v.push_back(tmp); } }
template<typename T1, typename T2> void cinV(std::vector< std::pair<T1, T2> > &v, const int size)
{ T1 tmp1; T2 tmp2; rep(i, size) { std::cin >> tmp1 >> tmp2; v.push_back(std::make_pair(tmp1, tmp2)); } }
template<typename T> void coutV(const std::vector< T > &v, const int begin = 0, const bool vbCrLf = false) {
	if (!vbCrLf) {
		if (v.size() <= begin) return;
		std::cout << v[begin];
		REP(i, begin + 1, v.size()) std::cout << " " << v[i];
		std::cout << std::endl;
	}
	else REP(i, begin, v.size()) std::cout << v[i] << std::endl;
}
template<typename T1, typename T2> void coutV(const std::vector< std::pair<T1, T2> > &v, const int begin = 0)
{ if (v.size() > begin) REP(i, begin, v.size()) std::cout << v[i].first << " " << v[i].second << std::endl; }
template<typename T> void sortV(std::vector< T > &v, const bool greater = false)
{ if (!greater) std::sort(v.begin(), v.end()); else std::sort(v.begin(), v.end(), std::greater< T >()); }
template<typename T> int findV(const std::vector< T > &v, const T _Val) { return find(v.begin(), v.end(), _Val) - v.begin(); }
template<typename T> bool existV(const std::vector< T > &v, const T _Val) { return findV(v, _Val) != v.end(); }
#endif
template<typename T> bool IsBetween(T min, T x, T max) { return min <= x && x < max; }
#endif


/*桁数の指定
//#include<iomanip>
//もう一度桁数を指定するまでこのまま固定される
cout << std::setprecision(3) << 3.1415 << endl;//3.14
*/

/*回転行列の公式
|cosθ, -sinθ||x| = | xcosθ - ysinθ |
|sinθ,  cosθ||y|   | xsinθ + ycosθ |
*/

/*クラスについて。　operator=の実装と、自作クラスのベクターの扱い方がわかる。
class Node {
public:
	int id;
	int depth;
	vector<Node*> child;
	Node* parent;

public:
	Node(void) {
		this->id = 0;
		this->depth = 0;
		this->parent = NULL;
		this->child;
	}

	void append(Node* node) {
		this->child.push_back(node);
		node->parent = this;
	}

	Node& operator=(Node node) {
		this->id = node.id;
		this->depth = node.depth;
		this->parent = node.parent;
		this->child = node.child;
	}

	void calcDepth(void) {
		rep(i, (this->child.size())) {
			this->child[i]->depth = this->depth + 1;
			this->child[i]->calcDepth();
		}
	}
};

vector<Node> nodes(n);//この時点でコンストラクタは呼ばれない。
rep(i,n) {
	nodes[i];//たぶんここで呼ばれる。（コンストラクタへの変数の渡し方はわからなかった）
	nodes[i].id=i;//idを代入しておく必要があったので無理矢理渡している。普通のプログラムでは問題ないかと
}
*/


using namespace std;

int main(void) {
	string str;
	cin >> str;
	if (str.back() == 's') cout << (str + "es") << endl;
	else cout << (str + "s") << endl;
}

Measured memory_bytes: 3636