#include <bits/stdc++.h>
using namespace std;
template <typename T>
bool readInteger(T& x) {
  char c, r = 0, n = 0;
  x = 0;
  while (true) {
    c = getchar();
    if (c < 0 && !r)
      return 0;
    else if (c == '-' && !r)
      n = 1;
    else if (c >= '0' && c <= '9')
      x = x * 10 + c - '0', r = 1;
    else if (r)
      break;
  }
  if (n) x = -x;
  return 1;
}
template <typename T>
vector<T> readIntegral(int n) {
  vector<T> ret(n);
  for (int i = 0; i < n; i++) readInteger(ret[i]);
  return ret;
}
auto readInts = readIntegral<int>;
auto readLongs = readIntegral<long long>;
template <typename T, T MOD>
struct ModInt {
  T value;
  ModInt() : value(0) {}
  ModInt(T x) {
    x %= MOD;
    if (x < 0) x += MOD;
    value = x;
  }

 public:
  ModInt& operator+=(ModInt x) {
    value += x.value;
    if (value >= MOD) value -= MOD;
    return *this;
  }
  ModInt& operator-=(ModInt x) {
    value -= x.value;
    if (value < 0) value += MOD;
    return *this;
  }
  ModInt& operator*=(ModInt x) {
    value *= x.value;
    value %= MOD;
    return *this;
  }
  ModInt& operator/=(ModInt x) {
    x.invert();
    return *this *= x;
  }
  ModInt operator+(ModInt x) const {
    ModInt o = *this;
    o += x;
    return o;
  }
  ModInt operator-(ModInt x) const {
    ModInt o = *this;
    o -= x;
    return o;
  }
  ModInt operator*(ModInt x) const {
    ModInt o = *this;
    o *= x;
    return o;
  }
  ModInt operator/(ModInt x) const {
    ModInt o = *this;
    o /= x;
    return o;
  }
  bool operator==(ModInt x) const { return value == x.value; }
  bool operator!=(ModInt x) const { return !(*this == x); }
  ModInt operator-() const { return ModInt(0) - *this; }
  ModInt operator^(long long x) const {
    ModInt ret = 1 % MOD;
    ModInt mul = *this;
    while (x) {
      if (x & 1) ret *= mul;
      mul *= mul;
      x >>= 1;
    }
    return ret;
  }
  ModInt& operator^=(long long x) { return *this = *this ^ x; }

 private:
  void invert() { *this ^= MOD - 2; }

 public:
  void answer() { std::cout << value << std::endl; }
};
int the_num;
int weight[150];
bool prime[150];
bool good(const vector<int>& v) {
  for (auto& x : (v))
    if (prime[x] != prime[v[0]]) return false;
  return true;
}
bool ask(int x) {
  cout << x << endl;
  string ret;
  cin >> ret;
  return ret == "yes";
}
int solve() {
  vector<int> poss;
  for (int i = 2; i <= 100; i++) poss.push_back(i);
  int queries = 0;
  while (!good(poss)) {
    int tot = 0;
    for (auto& x : (poss)) tot += weight[x];
    int bestCnt = tot + 1;
    vector<int> vb;
    for (int i = 2; i <= 100; i++) {
      int c = 0;
      for (auto& x : (poss))
        if (x % i == 0) c += weight[x];
      c = max(c, tot - c);
      if (c < bestCnt) {
        bestCnt = c;
        vb = {i};
      } else if (c == bestCnt)
        vb.push_back(i);
    }
    int best = vb[0];
    bool ans = ask(best);
    ++queries;
    vector<int> nposs;
    for (auto& x : (poss)) {
      if ((x % best == 0) == ans) nposs.push_back(x);
    }
    poss = nposs;
  }
  if (prime[poss[0]])
    printf("prime\n");
  else
    printf("composite\n");
  return queries;
}
int main() {
  for (int i = (0); i < int(150); ++i) prime[i] = true;
  for (int i = (2); i < int(150); ++i)
    for (int j = i * 2; j < 150; j += i) prime[j] = false;
  for (int i = (0); i < int(150); ++i) weight[i] = 100 - i;
  solve();
}
