#include <cstdio>
#include<string.h>
#include <algorithm>
#include <queue>
using namespace std;
typedef pair<int,pair<int,int> > PP;
int r,w[2],h[2],x[2],y[2];
long long level[501][501][2];
bool used[501][501][2]={};
long long sparklingdaydream[501][501][2];
long long need[250005][2]={};
long long s[250005]={},d[250005]={};
int main(){
    while(1){
        memset(need,0,sizeof(need) );
        memset(s,0,sizeof(s) );
        memset(d,0,sizeof(d) );
        memset(used,false,sizeof(used) );
    priority_queue<PP,vector<PP>,greater<PP> >pque;
    scanf("%d",&r);
    if(r==0) break;
    scanf("%d %d %d %d",&w[0],&h[0],&x[0],&y[0]);
    for(int r=0;r<501;r++){
        for(int g=0;g<501;g++){
                sparklingdaydream[r][g][0]=1000000000000;
                level[r][g][0]=1000000000000;
            }
        }
    for(int i=1;i<=h[0];i++){
        for(int j=1;j<=w[0];j++){
            scanf("%lld",&level[j][i][0]);
        }
    }
    sparklingdaydream[x[0]][y[0]][0]=1;
    pque.push(make_pair(sparklingdaydream[x[0]][y[0]][0],make_pair(x[0],y[0])));
    int dx[3]={0,1,-1};
    int dy[3]={0,1,-1};
    while(!pque.empty()){
        PP p=pque.top();
        pque.pop();
        used[p.second.first][p.second.second][0]=true;
        for(int k=0;k<3;k++){
            for(int l=0;l<3;l++){
                if(k!=l && (k==0 || l==0)){
                    if(!used[p.second.first+dx[k]][p.second.second+dy[l]][0]){
                        if(p.second.first+dx[k]>=1 && p.second.first+dx[k]<=w[0] && p.second.second+dy[l]>=1 && p.second.second+dy[l]<=h[0]){
                            long long h=p.first;
                            sparklingdaydream[p.second.first+dx[k]][p.second.second+dy[l]][0]=max(h,level[p.second.first+dx[k]][p.second.second+dy[l]][0]);
                            pque.push(make_pair(sparklingdaydream[p.second.first+dx[k]][p.second.second+dy[l]][0],make_pair(p.second.first+dx[k],p.second.second+dy[l])));
                            used[p.second.first+dx[k]][p.second.second+dy[l]][0]=true;
                        }
                    }
                    }
                }
            }
        }
    for(int r=0;r<501;r++){
        for(int g=0;g<501;g++){
                sparklingdaydream[r][g][1]=1000000000000;
                level[r][g][1]=1000000000000;
            }
        }
    scanf("%d %d %d %d",&w[1],&h[1],&x[1],&y[1]);
    for(int i=1;i<=h[1];i++){
        for(int j=1;j<=w[1];j++){
            scanf("%lld",&level[j][i][1]);
        }
    }
    sparklingdaydream[x[1]][y[1]][1]=1;
    pque.push(make_pair(sparklingdaydream[x[1]][y[1]][1],make_pair(x[1],y[1])));
    while(!pque.empty()){
        PP p=pque.top();
        pque.pop();
        used[p.second.first][p.second.second][1]=true;
        for(int k=0;k<3;k++){
            for(int l=0;l<3;l++){
                if(k!=l && (k==0 || l==0)){
                    if(!used[p.second.first+dx[k]][p.second.second+dy[l]][1]){
                        if(p.second.first+dx[k]>=1 && p.second.first+dx[k]<=w[1] && p.second.second+dy[l]>=1 && p.second.second+dy[l]<=h[1]){
                            long long h=p.first;
                            sparklingdaydream[p.second.first+dx[k]][p.second.second+dy[l]][1]=max(h,level[p.second.first+dx[k]][p.second.second+dy[l]][1]);
                            pque.push(make_pair(sparklingdaydream[p.second.first+dx[k]][p.second.second+dy[l]][1],make_pair(p.second.first+dx[k],p.second.second+dy[l])));
                            used[p.second.first+dx[k]][p.second.second+dy[l]][1]=true;
                        }
                    }
                    }
                }
            }
        }
    int g=0;
    for(int i=1;i<=w[0];i++){
        for(int j=1;j<=h[0];j++){
            s[g]=sparklingdaydream[i][j][0];
            g++;
        }
    }
    sort(s,s+g);
    int eee=1;
    for(int i=0;i<g;i++){
        if(s[i]!=s[i+1]){
            for(int j=eee;j<=i+1;j++){
                need[j][0]=s[i];
                eee=i+2;
            }
        }
    }
    g=0;
    for(int i=1;i<=w[1];i++){
        for(int j=1;j<=h[1];j++){
            d[g]=sparklingdaydream[i][j][1];
            g++;
        }
    }
    sort(d,d+g);
    eee=1;
    for(int i=0;i<g;i++){
        if(d[i]!=d[i+1]){
            for(int j=eee;j<=i+1;j++){
                need[j][1]=d[i];
                eee=i+2;
            }
        }
    }
    long long ans=10000000000;
    for(int i=1;i<250005;i++){
        for(int j=0;j<2;j++){
            if(!need[i][j]){
            need[i][j]=10000000000000;
            }
        }
    }
    for(int i=0;i<=r;i++){
        ans=min(ans,need[i][0]+need[r-i][1]);
    }
    printf("%lld\n",ans);
    }
    return 0;
}

 

Measured memory_bytes: 17676