#include<bits/stdc++.h>
#define lint long long int
#define rep(i,n) for(int i=0;i<int(n);i++)
#define per(i,n) for(int i=n-1;i>=0;i--)
#define arep(i,a,n) for(int i=a;i<n;i++)
#define sort(a) sort(a.begin(),a.end())
#define reverse(a) reverse(a.begin(),a.end())
#define fill(a,x) fill(a.begin(),a.end(),x)
#define eb(data) emplace_back(data)
#define pb(data) emplace_back(data)
#define mp make_pair
#define ALNUM 26
#define vint vector<int>
#define vlint vector<lint>
#define F first
#define S second
#define ALL(data) data.begin(),data.end()
#define GEts(s) getline(cin,s);
#define UNIQUE(vec) vec.erase(unique(vec.begin(), vec.end()), vec.end())

using namespace std;
template<typename Rast>inline void out(Rast rast){cout<<rast<<"\n";return;}
template<typename Rast>inline void in(Rast& rast){cin>>rast;return;}
template<typename T>istream& operator >> (istream& is, vector<T>& vec){for(T& x: vec) is >> x;return is;}
template<typename First, typename... Rest>void in(First& first, Rest&... rest){cin >> first;in(rest...);return;}
template<typename First, typename... Rest>void out(First first, Rest... rest){cout << first<<" ";out(rest...);return;}
template<typename T>T gcd(T a,T b){if(b==0)return a;return gcd(b,a%b);}
template<typename T>T lcm(T a,T b){return a * b / gcd(a, b);}
template<typename T1,typename T2>bool chmax(T1& a,T2 b){if(a<b){a=b;return true;}else{return false;}}
template<typename T1,typename T2>bool chmin(T1& a,T2 b){if(a>b){a=b;return true;}else{return false;}}

static const double pi = 3.141592653589793;
int modpow(int a,int n,int p){if (n==0)return 1%p; if(n==1)return a%p;if(n%2==1)return (a*modpow(a,n-1,p))%p;lint t=modpow(a,n/2,p);return (t*t)%p;}//a^n%p
lint MOD=pow(10,9)+7;
//lint MOD=998244353;
lint inf=pow(2,50);
int intinf=pow(2,30);
/**int dirx[]={1,0};int diry[]={0,1};//*///右、下
/**int dirx[]={0,1,0,-1};int diry[]={-1,0,1,0};//*///四方位
/**int dirx[]={-1,0,1,1,1,0,-1,-1};int diry[]={-1,-1,-1,0,1,1,1,0};//*///八方位


class unionfind{
public:
	vector<int> table;
	void init(int size){
		table.resize(size);
		rep(i,size)table[i]=i;
	};
	int root(int index){
		if(table[index]==index)return index;
		else{
			int hoge=root(table[index]);
			table[index]=hoge;
			return hoge;
		}
	};
	bool same(int x,int y){
		return(root(x)==root(y));
	};
	int marge(int x,int y){
		int yroot=root(y);
		int xroot=root(x);
		if(xroot==yroot)return 0;
		table[yroot]=xroot;
		return 0;
	}
	int getsize(){
		set<int> ma;
		rep(i,table.size())ma.insert(root(i));
		int re=ma.size();
		return re;
	}
};

string s;
int n;
int ans=intinf;//めちゃくちゃでかい値

int dfs(string bit){
	//再帰関数
	if(bit.size()==n){
		//サイズがNのビット列が生成されている
		//各bitにあった処理をするよ
		//22454367
		//00010001
		//57
		//6663277
		//6+6+6+3+2+7+7=37
		int val=0;//各桁の総和
		int count=0;
		for(int i=0;i<n;i++){
			if(bit[i]=='0'){
				//消してないから足している
				val+=(s[i]-'0');
			}else{
				//消してるから数える
				count++;
			}
		}
		if(val%3==0&&val!=0){
			//いくつかの桁を消したら割り切れた数になってるな
			//ここで答えを更新すれば良い
			ans=min(ans,count);
		}
	}
	else{
		dfs(bit+'0');
		dfs(bit+'1');
	}
	return 0;
}

int main(){
	cin.tie(0);ios::sync_with_stdio(false);cout<<std::fixed<<std::setprecision(16);
	cin>>s;
	n=s.size();
	dfs("");
	if(ans==intinf){
		//めちゃくちゃでかい値だったら初期値のままだから更新されてないため
		cout<<-1<<endl;
	}else{
		cout<<ans<<endl;
	}
	return 0;
}

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 105;
int k,ans;
char ch[MAXN];

inline int dfs(int sum,int x,int cnt)
{
	if(sum % 3 == 0 && sum > 0)
	return cnt;
	if(x > k)
	return 0x3f3f3f3f;
	return min(dfs(sum - ch[x] + '0',x+1,cnt+1),dfs(sum,x+1,cnt));
}

int main()
{
	scanf("%s",ch+1);
	k = strlen(ch+1);
	for(int i = 1;i <= k;i++)
	ans += ch[i] - '0';
	int x = dfs(ans,1,0);
	if(x == 0x3f3f3f3f)
		printf("-1\n");
	else
		printf("%d\n",x);
	return 0;
}