import java.io.*;
import java.util.*;
public class Main {
public static StringTokenizer stk;
public static StringBuilder sb = new StringBuilder();
public static int[][][] map = new int[5][5][5];
public static boolean[][][] visited = new boolean[5][5][5];
public static int[] p = {0, 0, 0, 0, 0}; //nCr로 순서를 정할 때 idx를 저장하는 배열
public static int[] dx = {1, -1, 0, 0, 0, 0};
public static int[] dy = {0, 0, 1, -1, 0, 0};
public static int[] dh = {0, 0, 0, 0, 1, -1};
public static int ans = Integer.MAX_VALUE;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for (int i = 0; i < 5; i++) { //높이
for (int j = 0; j < 5; j++) { //가로
stk = new StringTokenizer(br.readLine());
for (int k = 0; k < 5; k++) { //세로
map[i][j][k] = Integer.parseInt(stk.nextToken());
}
}
}
nCr(0, new boolean[5]);
System.out.println(ans == Integer.MAX_VALUE ? -1 : ans);
}
//참가자가 5개의 판을 쌓는 5!의 경우의 수
public static void nCr(int cnt, boolean[] visited) {
if (cnt == 5) { //경우의 수를 찾았을때마다 만든 배열을 가지고 Backtracking 함수 호출
int[][][] nmap = new int[5][5][5];
for (int i = 0; i < 5; i++) {
int idx = p[i];
for (int x = 0; x < 5; x++) {
for (int y = 0; y < 5; y++) {
nmap[i][x][y] = map[idx][x][y];
}
}
}
Backtracking(0, new int[5][5][5], nmap);
return;
}
for (int i = 0; i < 5; i++) {
if (!visited[i]) {
visited[i] = true;
p[i] = cnt;
nCr(cnt + 1, visited);
p[i] = 0;
visited[i] = false;
}
}
return;
}
//dfs를 이용하여 각 높이별 회전할 때의 저장배열
public static void Backtracking(int height, int[][][] nmap, int[][][] map) {
if (height == 5) { //배치한 판을 회전시킨 경우의 수마다 bfs
if (nmap[0][0][0] == 1 && nmap[4][4][4] == 1) {
int tmp = bfs(nmap);
if (tmp != -1) ans = Math.min(ans, tmp);
}
return;
}
for (int cnt = 1; cnt <= 4; cnt++) { //반시계 돌리는 횟수
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (map[height][i][j] == 1) {
switch (cnt) {
case 1:
nmap[height][j][4 - i] = 1;
break;
case 2:
nmap[height][4 - i][4 - j] = 1;
break;
case 3:
nmap[height][4 - j][i] = 1;
break;
case 4:
nmap[height][i][j] = 1;
break;
}
}
}
}
Backtracking(height + 1, nmap, map);
nmap[height] = new int[5][5];
}
return;
}
//bfs를 이용해서 저장된 nmap을 가지고 정점가능횟수 찾는 횟수
public static int bfs(int[][][] nmap) {
Queue<Point> q = new LinkedList<>();
visited = new boolean[5][5][5];
q.add(new Point(0, 0, 0, 0));
while (!q.isEmpty()) {
Point p = q.poll();
if (p.height == 4 && p.x == 4 && p.y == 4) return p.cnt;
if (!visited[p.height][p.x][p.y]) {
visited[p.height][p.x][p.y] = true;
for (int k = 0; k < 6; k++) {
int nh = p.height + dh[k];
int nx = p.x + dx[k];
int ny = p.y + dy[k];
if (check(nh, nx, ny) && nmap[nh][nx][ny] == 1 && !visited[nh][nx][ny]) {
q.add(new Point(nh, nx, ny, p.cnt + 1));
}
}
}
}
return -1;
}
public static boolean check(int h, int x, int y) {
if (h >= 0 && h < 5 && x >= 0 && x < 5 && y >= 0 && y < 5) return true;
return false;
}
public static class Point {
int height, x, y, cnt;
public Point(int height, int x, int y, int cnt) {
this.height = height;
this.x = x;
this.y = y;
this.cnt = cnt;
}
}
}