#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <deque>
#include <set>
#include <map>
using namespace std;

typedef long long ll;
typedef double lf;
typedef long double Lf;
typedef pair <int,int> pii;
typedef pair <ll, ll> pll;

#define TRACE(x) cerr << #x << "  " << x << endl
#define FOR(i, a, b) for (int i = (a); i < int(b); i++)
#define REP(i, n) FOR(i, 0, n)
#define all(x) (x).begin(), (x).end()
#define _ << " " <<

#define fi first
#define sec second
#define mp make_pair

const int MAXN = 110;

const int tip1[] = {'Q','W','E','R','T','Y','U','I','O','P'};
const int tip2[] = {'A','S','D','F','G','H','J','K','L'};
const int tip3[] = {'Z','X','C','V','B','N','M'};

pii get(int t) {
	REP(i, 10) if (tip1[i] == t) return mp(0, i);
	REP(i, 9) if (tip2[i] == t) return mp(1, i);
	REP(i, 7) if (tip3[i] == t) return mp(2, i);
}

int n, dp[MAXN][3][11][3][11];
char s[MAXN];

int rek(int cvor, int a1, int b1, int a2, int b2) {
	if (cvor == n) return 0;
	if (dp[cvor][a1][b1][a2][b2] != -1) return dp[cvor][a1][b1][a2][b2];
	int ret = (1 << 30);

	pii t = get(s[cvor]);

	ret = min(ret, rek(cvor + 1, a1, b1, t.fi, t.sec) + max(a2-t.fi,t.fi-a2) + max(b2-t.sec,t.sec-b2));
	ret = min(ret, rek(cvor + 1, t.fi, t.sec, a2, b2) + max(a1-t.fi,t.fi-a1) + max(b1-t.sec,t.sec-b1));

	return dp[cvor][a1][b1][a2][b2] = ret;
}

int main() {
	scanf("%s",s);
	n = strlen(s);
	memset(dp, -1, sizeof dp);
	pii t1 = get('F');
	pii t2 = get('J');
	printf("%d\n",rek(0,t1.fi,t1.sec,t2.fi,t2.sec));
	return 0;
}