#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<vector>
#include<algorithm>
#include<functional>
#include<map>

using namespace std;
typedef long long ll;
typedef pair<int,int> P;
typedef pair<ll,P> PP;
int r;
ll INF;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int w[2],h[2],x[2],y[2];
ll dp[2][500001];
ll fie[2][501][501];
bool used[2][501][501];

void dijk(int f){
	priority_queue<PP,vector<PP>,greater<PP> > que;
	que.push(PP(fie[f][x[f]][y[f]],P(x[f],y[f])));
	int cnt=1;
	while(que.size()){
		PP p=que.top();
		que.pop();
		ll cost=p.first;
		int px=p.second.first;
		int py=p.second.second;
		if(used[f][px][py])continue;
		used[f][px][py]=true;
		dp[f][cnt]=max(cost,dp[f][cnt-1]);
		cnt++;
		for(int i=0;i<4;i++){
			int nx=px+dx[i];
			int ny=py+dy[i];
			if(nx>=0 && nx<w[f] && ny>=0 && ny<h[f]){
				if(!used[f][nx][ny]){
					que.push(PP(fie[f][nx][ny],P(nx,ny)));
				}
			}
		}
	}
}

int main(void){
	while(1){
		INF=0;
		memset(dp,0,sizeof(dp));
		memset(fie,0,sizeof(fie));
		memset(used,false,sizeof(used));
		scanf("%d",&r);
		if(r==0)break;
		scanf("%d%d%d%d",&w[0],&h[0],&x[0],&y[0]);
		x[0]--,y[0]--;
		for(int i=0;i<h[0];i++){
			for(int j=0;j<w[0];j++){
				scanf("%lld",&fie[0][j][i]);
				INF+=fie[0][j][i];
			}
		}
		scanf("%d%d%d%d",&w[1],&h[1],&x[1],&y[1]);
		x[1]--,y[1]--;
		for(int i=0;i<h[1];i++){
			for(int j=0;j<w[1];j++){
				scanf("%lld",&fie[1][j][i]);
				INF+=fie[1][j][i];
			}
		}
		dijk(0);
		dijk(1);
		ll res=INF;
		for(int i=0;i<=r;i++){
			if(w[0]*h[0]<i)continue;
			if(w[1]*h[1]<r-i)continue;
			res=min(res,dp[0][i]+dp[1][r-i]);
		}
		printf("%d\n",res);
	}
	return 0;
}