#include <bits/stdc++.h>
using namespace std;
template <typename _Tp>
bool maximize(_Tp &__a, _Tp __b) {
  if (__a < __b) {
    __a = __b;
    return true;
  }
  return false;
}
template <typename _Tp>
bool minimize(_Tp &__a, _Tp __b) {
  if (__a > __b) {
    __a = __b;
    return true;
  }
  return false;
}
const int siz = 1e5 + 2;
const int SIZ = 1e6 + 2;
const int mod = 1e9 + 7;
const int maxx = 2e9;
const long long MAXX = 1e18;
const string file = "3";
vector<int> dgt;
int f[siz][3][2];
bool g[siz][3][2];
int dp(int pos, int rem, int lead) {
  if (pos == (int)(dgt).size()) {
    if (rem == 0) {
      return 0;
    }
    return -maxx;
  }
  int &res = f[pos][rem][lead];
  bool &cal = g[pos][rem][lead];
  if (cal) {
    return res;
  }
  res = dp(pos + 1, rem, lead);
  if (dgt[pos] == 0) {
    if (!lead) {
      maximize(res, dp(pos + 1, rem, 0) + 1);
    }
  } else {
    maximize(res, dp(pos + 1, (rem + dgt[pos]) % 3, 0) + 1);
  }
  cal = true;
  return res;
}
void trace(int pos, int rem, int lead) {
  if (pos == (int)(dgt).size()) {
    return;
  }
  int res = dp(pos, rem, lead);
  if (res == dp(pos + 1, rem, lead)) {
    trace(pos + 1, rem, lead);
    return;
  }
  if (dgt[pos] == 0) {
    if (!lead) {
      if (res == dp(pos + 1, rem, 0) + 1) {
        cout << 0;
        trace(pos + 1, rem, 0);
        return;
      }
    }
  } else {
    if (res == dp(pos + 1, (rem + dgt[pos]) % 3, 0) + 1) {
      cout << dgt[pos];
      trace(pos + 1, (rem + dgt[pos]) % 3, 0);
      return;
    }
  }
  assert(0);
}
signed main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  string s;
  cin >> s;
  bool chk = false;
  for (auto c : s) {
    dgt.push_back(c - '0');
    if (c == '0') {
      chk = true;
    }
  }
  if (!dp(0, 0, 1)) {
    if (chk) {
      cout << 0 << "\n";
    } else {
      cout << -1 << "\n";
    }
    return 0;
  }
  trace(0, 0, 1);
  cout << "\n";
  return 0;
}
