#include<queue>
#include<cstdio>
#include<vector>
#include<algorithm>

#define	mp	make_pair
#define	pb	push_back

using namespace std;

typedef	pair<int,int>	pii;

const int dx[]={1,0,-1,0},dy[]={0,-1,0,1};

int main(){
	for(int r;scanf("%d",&r),r;){
		int w[2],h[2],x[2],y[2];
		static int room[2][500][500];
		vector<pii> roomcnt[2];	// <auth lev,number of rooms>
		for(int k=0;k<2;k++){
			scanf("%d%d%d%d",&w[k],&h[k],&x[k],&y[k]);
			x[k]--,y[k]--;
			for(int i=0;i<h[k];i++)for(int j=0;j<w[k];j++)	scanf("%d",&room[k][i][j]);

			static bool visited[500][500];
			for(int i=0;i<h[k];i++)for(int j=0;j<w[k];j++)	visited[i][j]=false;
			visited[y[k]][x[k]]=true;
			roomcnt[k].pb(mp(0,0));

			int cnt=0,lev=0;
			priority_queue< pair<int,pii> > pq;
			pq.push(mp(-room[k][y[k]][x[k]],mp(y[k],x[k])));
			while(!pq.empty()){
				pair<int,pii> a=pq.top();	pq.pop();
				int nowlev=-a.first,x=a.second.second,y=a.second.first;
				cnt++;
				if(lev<nowlev){
					roomcnt[k].pb(mp(cnt,nowlev));
					lev=nowlev;
				}
				else	*(roomcnt[k].rbegin())=mp(cnt,lev);
				for(int i=0;i<4;i++){
					int xx=x+dx[i],yy=y+dy[i];
					if(0<=xx && xx<w[k] && 0<=yy && yy<h[k] && !visited[yy][xx]){
						pq.push(mp(-room[k][yy][xx],mp(yy,xx)));
						visited[yy][xx]=true;
					}
				}
			}
		}

		int ans=1<<30;
		for(int i=0;i<roomcnt[0].size();i++){
			int rem=r-roomcnt[0][i].first;
			vector<pii>::iterator it=lower_bound(roomcnt[1].begin(),roomcnt[1].end(),mp(rem,0));
			if(it!=roomcnt[1].end()){
				int lev1=roomcnt[0][i].second;
				int lev2=it->second;
				ans=min(ans,lev1+lev2);
			}
		}
		printf("%d\n",ans);
	}

	return 0;
}