#include <bits/stdc++.h>
#define REP(i, n) for(ll i = 0; i < (n); i++)
#define REP1(i, n) for(ll i = 1; i <= (n); i++)
#define REPD(i,a,b) for (ll i=(a);i<=(b);i++)
#define ALL(v) (v).begin(), (v).end()
using namespace std;
typedef long long ll;
typedef double d;
typedef long double ld;
typedef vector<string> vs;
typedef vector<bool> vb;
typedef vector<vb> vvb;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<d> vd;
typedef vector<ld> vld;
typedef set<int> si;
typedef vector<si> vsi;
typedef vector<ll> vll;
typedef vector<vll> vvll;
typedef pair<int, int> pi;
typedef queue<int> qi;
typedef queue<pi> qpi;
typedef pair<ll, ll> pll;
typedef queue<pll> qpll;
typedef vector<pi> vpi;
typedef vector<pll> vpll;
const int mod = 1000000007;
const int INF = 1001001001;
// 小数点 << fixed << setprecision(10) <<
// sort降順 sort(ALL(),greater<int>());
// 円周率 M_PI
// 文字判定 isupper islower
// 順列 do {} while(next_permutation(ALL(X)));
// 最大値 LLONG_MAX
// a内でx以上 auto iter = lower_bound(ALL(a), x);
// a内でxより大きい auto iter = upper_bound(ALL(a), x);
int dx[8] = {1, 0, -1, 0, 1, 1, -1, -1};
int dy[8] = {0, 1, 0, -1, 1, -1, 1, -1};
struct edge {
    int from; //出発点
    int to;   //到達点
    int cost; //移動コスト
};
typedef struct edge se;
typedef vector<edge> ve;

// 重複した要素を取り除いて返す
vll deleteDuplication(vll &numberlist) {
  sort(ALL(numberlist));
  numberlist.erase(unique(ALL(numberlist)),numberlist.end());
  return numberlist;
}

// 2つの数の最大公約数を求める
unsigned Euclidean_gcd(unsigned a, unsigned b) {
  if(a < b) return Euclidean_gcd(b, a);
  unsigned r;
  while ((r=a%b)) {
    a = b;
    b = r;
  }
  return b;
}

// 各桁の数を合計
int digit_sum(int n) {
  int sum=n%10;
  while(n!=0) {
    n/=10;
    sum+=n%10;
  }
  return sum;
}

// 素因数分解してペアのリストを返す
vpll PrimeFactorization(ll n) {
  vpll res;
  for (ll i=2; i*i<=n; i++) {
    if(n%i!=0) continue;
    ll ex=0;
    while(n%i==0) {
      ex++;
      n/=i;
    }
    res.push_back(pll(i,ex));
  }
  if(n!=1) res.push_back(pll(n,1));
  return res;
}



int main() {
  string s;
  cin >> s;
  int n=s.length();
  vi digit(n);
  vi ch(3,0);
  REP(i,n) {
    digit[i]=int(s[i])%3;
    ch[digit[i]]++;
  }
  int sum=accumulate(ALL(digit),0);
  if(sum%3==0) cout << 0 << endl;
  else if(sum%3==1) {
    if(ch[1]>0&&n!=1) cout << 1 << endl;
    else if(ch[2]>1&&n!=2) cout << 2 << endl;
    else cout << -1 << endl;
  }
  else if(sum%3==2) {
    if(ch[2]>0&&n!=1) cout << 1 << endl;
    else if(ch[1]>1&&n!=2) cout << 2 << endl;
    else cout << -1 << endl;
  } 
  return 0;
}

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
    ll n; cin>>n;
    vector<ll>v1,v2;
    while(n)
    {
        v1.push_back(n%10);
        n/=10;
    }
    int n1=v1.size(); ll sum=0;
    for(auto it:v1)
    {
        sum+=it;
        if(it%3!=0)
            v2.push_back(it);
    }
    int ans=100;
    if(sum<3) ans=-1;
    else{
        ll sum1=0;
        for(auto it:v2)
            sum1+=it;
        if(sum1%3==0) ans=0;
        else{
                bool flag=0;
            for(auto it:v2){
                if((sum1-it)%3==0){
                    ans=1;
                    flag=1;
                    break;
                }
            }
            if(!flag){
                for(int i=0;i<v2.size();i++)
                {
                    for(int j=0;j<v2.size();j++)
                    {
                        if(j!=i&&(sum1-v2[i]-v2[j])%3==0)
                        {
                            ans=2;
                            flag=1;
                            break;
                        }
                    }
                }
                if(!flag) ans=-1;
            }
        }
        if(ans>n1-1) ans=-1;
    }
    cout<<ans<<endl;
}
