#include<bits/stdc++.h>
using namespace std;


int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
struct state{
  int d[5][5];
  void cpy(const state& s){
    for(int i=0;i<4;i++)
      for(int j=0;j<4;j++)
	d[i][j] = s.d[i][j];
  }
  

  void sim(){
    
    bool f = false;

    bool fl[5][5][4] = {};
    
    for(int i=0;i<4;i++){
      for(int j=0;j<4;j++){
	if( d[i][j] > 4 ){
	  d[i][j] = 0;
	  f = true;
	  for(int k=0;k<4;k++)
	    fl[i][j][k] = 1;
	}
      }
    }


    do{
      f = false;
      bool nf[5][5][4] = {};
    
      for(int i=0;i<4;i++){
	for(int j=0;j<4;j++){
	  for(int k=0;k<4;k++){
	
	    if( fl[i][j][k] == 1 ){
	      f = true;
	      if( d[i][j] > 0 ){
		d[i][j]++;
		fl[i][j][k] = 0;
	      } else {
		fl[i][j][k] = 0;  
		if( i + dx[k] >= 4 || j + dy[k] >= 4 ||
		    i + dx[k] < 0 || j + dy[k] < 0 ) continue;
		nf[i+dx[k]][j+dy[k]][k] = 1;		
	      }
	    }
	  }
	}
      }

      for(int i=0;i<4;i++)
	for(int j=0;j<4;j++)
	  for(int k=0;k<4;k++)
	    fl[i][j][k] = nf[i][j][k];


      for(int i=0;i<4;i++){
	for(int j=0;j<4;j++){
	  if( d[i][j] > 4 ){
	    d[i][j] = 0;
	    f = true;
	    for(int k=0;k<4;k++)
	      fl[i][j][k] = 1;
	  }
	}
      }

    }while(f);


  }

  bool check(){
    for(int i=0;i<4;i++)
      for(int j=0;j<4;j++)
	if( d[i][j] > 0 ) return false;
    return true;
  }

  void view(){
    cout << "view" << endl;
    for(int i=0;i<4;i++){
      for(int j=0;j<4;j++){
	cout << d[j][i];
      }
      cout << endl;
    }
  }

};

int res = 10;
int solve(state &s,int c){
  // s.view();
  if( s.check() ) return c;
  if( c == 5 || c > res ) {
    return -1;
  }
  for(int i=0;i<4;i++){
    for(int j=0;j<4;j++){
      state nex; nex.cpy( s );
      nex.d[i][j]++;
      nex.sim();
      int ret = solve( nex, c + 1 );
      if( ret > -1 ) res = min( res, ret );
    }
  }
  return res;
}


int main(){
  state s;
  for(int i=0;i<4;i++)
    for(int j=0;j<4;j++)
      cin >> s.d[j][i];
  int res = solve(s,0);
  if( res > 5 ) cout << -1 << endl;
  else cout << res << endl;
}