rt
#include<bits/stdc++.h>
using namespace std;
int n,m,A[20],fa[20],dp[65536];
struct Edge
{
int p,q,T;
bool operator <(const Edge &x)const{
return T<x.T;
}
}e[300];
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
void write(int x)
{
if(x<0)
putchar('-'),x=-x;
if(x>9)
write(x/10);
putchar(x%10+'0');
return;
}
int GetFather(int x)
{
return x==fa[x]?x:fa[x]=GetFather(fa[x]);
}
int Kruskal(int s)
{
int cnt=0;
for(int i=0;i<n;++i)
if(s>>i&1)
fa[i]=i,++cnt;
int res=0;--cnt;
for(int r1,r2,i=1;i<=m;++i)
{
if(!(s>>e[i].p&1) || !(s>>e[i].q&1))
continue;
if((r1=GetFather(e[i].p))==(r2=(e[i].q)))
continue;
fa[r1]=r2,res+=e[i].T;
if(!--cnt)
break;
}
return cnt ? INT_MAX : res;
}
int main()
{
n=read(),m=read();
for(int i=0;i<n;++i)
A[i]=read();
for(int i=1;i<=m;++i)
e[i].p=read(),e[i].q=read(),e[i].T=read();
sort(e+1,e+1+m);
int lim=(1<<n)-1;
for(int s=1;s<=lim;++s)
{
int sum=0;
for(int i=0;i<n;++i)
if(s>>i&1)
sum+=A[i];
if(sum)
dp[s]=INT_MAX;
else
dp[s]=Kruskal(s);
}
for(int s1=1;s1<=lim;++s1)
{
if(dp[s1]==INT_MAX)
continue;
for(int s2=1;s2<=lim;++s2)
{
if(dp[s2]==INT_MAX || s1&s2)
continue;
dp[s1|s2]=min(dp[s1|s2],dp[s1]+dp[s2]);
}
}
if(dp[lim]==INT_MAX)
puts("Impossible");
else
write(dp[lim]),putchar('\n');
return 0;
}
