#include <bits/stdc++.h>

using namespace std;

#define INF 1000000000
#define MAXL 105
#define MAXN 3
#define MAXM 11

char S[MAXN][MAXM] = { "QWERTYUIOP",
  "ASDFGHJKL",
  "ZXCVBNM"
};
map<char, pair<int, int> > pos;
int dp[MAXL][MAXN][MAXM][MAXN][MAXM];

void update(int &a, int b) {
  a = min(a, b);
}

int calcDist(int a, int b, int c, int d) {
  return abs(a - c) + abs(b - d);
}

int main() {
	// assert(freopen("keyboard.in", "r", stdin));
	// assert(freopen("keyboard.out", "w", stdout));
	cin.sync_with_stdio(false);

	for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 10; j++) {
      pos[ S[i][j] ] = { i, j };
    }
  }

  string str;
  cin >> str;

  int N = str.size();

  // init
  for (int p = 0; p <= N; p++) {
    for (int a = 0; a < MAXN; a++) {
      for (int b = 0; b < MAXM; b++) {
        for (int c = 0; c < MAXN; c++) {
          for (int d = 0; d < MAXM; d++) {
            dp[p][a][b][c][d] = INF;
          }
        }
      }
    }
  }

  dp[0][1][3][1][6] = 0;
  for (int i = 0; i < N; i++) {
    for (int a = 0; a < MAXN; a++) {
      for (int b = 0; b < MAXM; b++) {
        for (int c = 0; c < MAXN; c++) {
          for (int d = 0; d < MAXM; d++) {
            auto p = pos[ str[i] ];

            // type with left
            int cost = calcDist(a, b, p.first, p.second);
            update(dp[i + 1][p.first][p.second][c][d], dp[i][a][b][c][d] + cost);

            // type with right
            cost = calcDist(c, d, p.first, p.second);
            update(dp[i + 1][a][b][p.first][p.second], dp[i][a][b][c][d] + cost);
          }
        }
      }
    }
  }

  int ans = INF;
  for (int a = 0; a < MAXN; a++) {
    for (int b = 0; b < MAXM; b++) {
      for (int c = 0; c < MAXN; c++) {
        for (int d = 0; d < MAXM; d++) {
          ans = min(ans, dp[N][a][b][c][d]);
        }
      }
    }
  }

  cout << ans << endl;

	return 0;
}