#include<bits/stdc++.h>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
typedef pair<int,int> P;

int r,w[2],h[2],x[2],y[2],l[2][500][500],temp[500][500]; vector<P> d[2];

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

void search(int n){
    for(int i=0;i<500;i++) for(int j=0;j<500;j++) temp[i][j]=0;
    priority_queue<P, vector<P>, greater<P> > q; d[n].push_back(P(0,0));
    q.push(P(l[n][y[n]][x[n]],x[n]*1000+y[n])); temp[y[n]][x[n]]=1;
    int res=0;
    while(!q.empty()){
        P z=q.top(),qq;
        while(qq=q.top(),qq.first<=z.first&&!q.empty()){
            q.pop(); int X=qq.second/1000,Y=qq.second%1000; res++;
            for(int k=0;k<4;k++){
                int i=X+dx[k],j=Y+dy[k];
                if(i<0||j<0||i>=w[n]||j>=h[n]) continue;
                if(temp[j][i]) continue;
                q.push(P(l[n][j][i],i*1000+j)); temp[j][i]=1;
            }
        }
        d[n].push_back(P(res,l[n][z.second%1000][z.second/1000]));
    }
}

P l_b(int m){
    int lb=-1,rb=d[1].size()-1;
    while(lb+1<rb){
        int mid=(lb+rb)/2;
        if(d[1][mid].first>=m) rb=mid;
        else lb=mid;
    }
    return d[1][rb];
}

int main(){
    while(scanf("%d",&r),r!=0){
        for(int i=0;i<2;i++){
            scanf("%d%d%d%d",&w[i],&h[i],&x[i],&y[i]); x[i]--; y[i]--;
            for(int j=0;j<h[i];j++) for(int k=0;k<w[i];k++) scanf("%d",&l[i][j][k]);
            search(i);
        }
        int res=INT_MAX;
        for(int i=0;i<d[0].size();i++){
            P p=l_b(r-d[0][i].first);
            if(p.first+d[0][i].first>=r) res=min(res,p.second+d[0][i].second);
        }
        printf("%d\n",res);
        d[0].erase(d[0].begin(),d[0].end());
        d[1].erase(d[1].begin(),d[1].end());
    }
}