/*
    copy 
http://hi.baidu.com/matrush/blog/item/4a8f1d3c430e773370cf6cd4.html
    題意:給定n(n<=5)個(gè)必選點(diǎn),和m(m<=1000)個(gè)輔助點(diǎn),每個(gè)點(diǎn)有權(quán)值,以及帶權(quán)無(wú)向邊若干,求一棵代價(jià)最小的生成子樹(shù),使得n個(gè)必選點(diǎn)連通并且總權(quán)值最小。

    分析:這題比較巧妙,首先因?yàn)橛钟羞厵?quán)又有點(diǎn)權(quán)不好處理,所以我們先建一個(gè)虛擬點(diǎn)0,
    把所有點(diǎn)與0點(diǎn)連邊,邊權(quán)為該點(diǎn)的點(diǎn)權(quán),那么就轉(zhuǎn)化成了有n+m+1個(gè)點(diǎn),
    求出這些點(diǎn)中使0-n這n+1個(gè)點(diǎn)連通的最小生成樹(shù)。這個(gè)定義其實(shí)就是所謂的斯坦納樹(shù)。
    Steiner Tree是NP的,但是當(dāng)必選點(diǎn)較少時(shí),可以通過(guò)狀態(tài)壓縮DP來(lái)解,
    具體的DP狀態(tài)是dp[x][1<<m] 代表以x為根的樹(shù)并且包含state里的點(diǎn)的最小權(quán)值。
    那么求一棵樹(shù)就可以枚舉連接點(diǎn),以及兩個(gè)子樹(shù)的覆蓋狀態(tài),通過(guò)一個(gè)很漂亮的轉(zhuǎn)移方程來(lái)進(jìn)行轉(zhuǎn)移:
    dp[i][j]=min(dp[i][j],dp[i][k]+dp[i][j^k]),其中k是j的一個(gè)子集,而這個(gè)子集又可以通過(guò)位運(yùn)算枚舉子集來(lái)實(shí)現(xiàn):
    for (int sub = state;sub != 0;sub = (sub-1) & state)

*/
#include
<cstdio>
#include
<cstring>
#include
<algorithm>
#include
<queue>

using namespace std;

const int MAXN = 1010;
const int INF = 1000000000;

struct Edge
{
    
int u,v,w;
    Edge 
*next;
};

//dp[x][1<<m] 代表以x為根的樹(shù)并且包含state里的點(diǎn)的最小費(fèi)用
int dp[MAXN][1<<6];
int dist[MAXN][MAXN];
int chg[MAXN];
Edge edges[MAXN
*20] , *E[MAXN] , *pE;
bool inQ[MAXN];

void init(int n)
{
    pE 
= edges;
    
for(int i=0;i<=n;i++)E[i] = NULL;
}

inline 
void addE(int u,int v,int w)
{
    pE
->= v;
    pE
->= w;
    pE
->next = E[u];
    E[u] 
= pE++;
}    

void spfa(int now,int n)
{
    fill(inQ,inQ
+n+1,false);
    fill(dist[now],dist[now]
+n+1,INF);
    queue
<int>Q;
    Q.push(now);
    inQ[now] 
= 1;
    dist[now][now] 
= 0;
    
while(!Q.empty())
    {
        
int u = Q.front();
        Q.pop();
        inQ[u] 
= 0;
        
for( Edge *it = E[u]; it ;it = it->next)
        {
            
int v = it->v,w=it->w;
            
if(dist[now][v] > dist[now][u] + w)
            {
                dist[now][v] 
= dist[now][u] + w;
                
if(!inQ[v])
                {
                    inQ[v] 
= true;
                    Q.push(v);
                }
            }
        }
    }
}

int steiner(int m,int n,int chg[])//[0,m] [0,n] 0~n共n個(gè)點(diǎn)里面選出p中的m個(gè)點(diǎn)
{
    
for(int i=0;i<=n;i++)
    {
        spfa(i,n);
    }

    
for(int i=0;i<=m;i++)
        
for(int j=0;j<=n;j++)
            dp[j][
1<<i] = dist[chg[i]][j];

    
int limit = 1<<(m+1);
    
for(int state = 1; state < limit; state++)
    {
        
if((state - 1& state)//二進(jìn)制不止一個(gè)1
        {
            
for(int j = 0; j<=n; j++)
            {
                dp[j][state] 
= INF;
                
for(int _state = (state-1& state ; _state ; _state = (_state-1& state)    //枚舉子集
                    dp[j][state] = min(dp[j][state] , dp[j][_state] + dp[j][_state ^ state]);
            }
            
for(int j=0;j<=n;j++)
                
for(int k=0;k<=n;k++)
                    dp[j][state] 
= min(dp[j][state],dp[k][state] + dist[k][j]);
        }
    }

    
return dp[0][limit-1];
}
int main()
{
#ifdef ONLINE_JUDGE
#else 
    freopen(
"in","r",stdin);
#endif
    
int n,m,p;
    
while~scanf("%d%d%d",&n,&m,&p))
    {
        init(n
+m);
        
for(int i=1,val;i<=n+m;i++)
        {
            scanf(
"%d",&val);
            addE(i,
0,val);
            addE(
0,i,val);
        }
        
for(int i=0,u,v,w;i<p;i++)
        {
            scanf(
"%d%d%d",&u,&v,&w);
            addE(u,v,w);
            addE(v,u,w);
        }
        
for(int i=0;i<=n+m;i++)chg[i] = i;
        printf(
"%d\n",steiner(n,n+m,chg));
    }
    
return 0;
}