#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <iostream>
#include <queue>
#define lson rt<<1
#define rson rt<<1|1
using namespace std;
typedef long long ll;
typedef pair<int, int>  P;
typedef pair<int, P>  PP;
const int maxn=1e5+10;
int x[maxn],y[maxn];
int main()
{
    int a,b,m;
    cin>>a>>b>>m;
    int min1=1e9+7,min2=1e9+7;
    for(int i=0;i<a;i++){
        cin>>x[i];
        min1=min(min1,x[i]);
    }
    for(int j=0;j<b;j++)
    {
        cin>>y[j];
        min2=min(min2,y[j]);
    }
    int ans=1e9+8;
    for(int i=0;i<m;i++){
        int t1,t2,t3;
        cin>>t1>>t2>>t3;
        ans=min(ans,x[t1-1]+y[t2-1]-t3);
    }
    cout<<min(ans,min1+min2);
}
//const int maxn=1e3+10;
//struct Point
//{
//    int x,y;
//    Point(){}
//    Point(int _x,int _y)
//    {
//        x = _x;y = _y;
//    }
//    Point operator -(const Point &b)const
//    {
//        return Point(x - b.x,y - b.y);
//    }
//    int operator ^(const Point &b)const
//    {
//        return x*b.y - y*b.x;
//    }
//    int operator *(const Point &b)const
//    {
//        return x*b.x + y*b.y;
//    }
//};
//Point point[100],jizhan[maxn];
//int w[maxn];
//P ans[maxn];
//int dp[100];
//int main()
//{
//    int n,m;
//    while(scanf("%d", &n))
//    {
//        if(n==0)
//            break;
//        for(int i=0;i<n;i++)
//        {
//            scanf("%d%d",&point[i].x,&point[i].y);
//        }
//        scanf("%d",&m);
//        for(int i=0;i<m;i++)
//            scanf("%d%d%d",&jizhan[i].x,&jizhan[i].y,&w[i]);
//        int s,e;
//        for(int i=0;i<m;i++)
//        {
//            for(int j=0;j<n;j++)
//            {
//                int pre=(j-1+n)%n,nex=(j+1)%n;
//                int flag1,flag2;
//                if(((point[j]-jizhan[i])^(point[nex]-jizhan[i]))<0)
//                    flag1=1;
//                else
//                    flag1=0;
//
//                if(((point[pre]-jizhan[i])^(point[j]-jizhan[i]))<0)
//                    flag2=1;
//                else
//                    flag2=0;
//
//                if(flag1==1&&flag2==0)
//                {
//                    s=j;
//                }
//                if(flag1==0&&flag2==1)
//                {
//                    e=j;
//                }
//            }
////            cout<<s<<" "<<e<<endl;
//            ans[i]=make_pair(s, e);
//        }
//        vector<PP> qujian;
//        for(int i=0;i<m;i++)
//        {
//            if(ans[i].first<ans[i].second)
//            {
//                qujian.push_back(make_pair(ans[i].first+1, make_pair(ans[i].second+1,w[i])));
//                qujian.push_back(make_pair(ans[i].first+1+n, make_pair(ans[i].second+1+n,w[i])));
//            }
//            else
//            {
//                qujian.push_back(make_pair(ans[i].first+1, make_pair(ans[i].second+1+n,w[i])));
//            }
//        }
//        sort(qujian.begin(), qujian.end());
//        int ans=1e9;
//        for(int i=1;i<=n;i++)
//        {
//            for(int j=0;j<=2*n;j++)
//                dp[j]=1e9;
//            dp[i-1]=0;
//            for(int j=0;j<qujian.size();j++)
//            {
//                int l=qujian[j].first,r=qujian[j].second.first,w=qujian[j].second.second;
////                cout<<l<<" "<<r<<" "<<w<<endl;
//                for(int k=l;k<=r;k++)
//                {
//                    dp[r]=min(dp[r],dp[k]+w);
//                }
//            }
//            for(int j=i+n-1;j<=2*n;j++)
//                ans=min(ans,dp[j]);
//        }
//
//        if(ans!=1e9)
//            printf("%d\n",ans);
//
//        else
//            printf("Impossible.\n");
//
//    }
//}
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//


Measured memory_bytes: 1024