http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2853
//1865331 2009-05-11 21:26:46 Accepted  2853 C++ 3790 1484 aslys 
#include<iostream>
using namespace std;
const int N = 204;
int n;
double matrix[N][N];
double x[N][N],y[N][N],z[N][N];
void fun(int k,double m[][N])
{
    
int i,j,p,t;
    
double sum;
    
if(k == 1)  //矩阵的一次方
    {
        
for(i=0;i<n;i++)
            
for(j=0;j<n;j++)
                m[i][j] 
= matrix[i][j];
    }

    
else if(k == 2//矩阵的二次方
    {
        
for(i=0;i<n;i++)
            
for(j=0;j<n;j++)
            
{
                sum 
= matrix[i][0* matrix[0][j];
                
for(p=1;p<n;p++)
                    sum 
+= matrix[i][p] * matrix[p][j];
                m[i][j] 
= sum;
            }

    }

    
else  //矩阵的 k 次方 ,先计算出 k/2 次方 ,加快计算速度
    
        t 
= k/2;    
        fun(t,x); 
//递归调用
        for(i=0;i<n;i++)
            
for(j=0;j<n;j++)
            
{
                sum 
= x[i][0* x[0][j];
                
for(p=1;p<n;p++)
                    sum 
+= x[i][p] * x[p][j];
                y[i][j] 
= sum;
            }

        
if( k % 2 == 1)      // 比如对矩阵A :A^9 = A^4 * A^4 * A
        {
            
for(i=0;i<n;i++)
                
for(j=0;j<n;j++)
                
{
                    sum 
= matrix[i][0* y[0][j];
                     
for(p=1;p<n;p++)
                         sum 
+= matrix[i][p] * y[p][j];;
                    m[i][j] 
= sum;
            }

        }

        
else    
        
{
            
for(i=0;i<n;i++)
                
for(j=0;j<n;j++)
                    m[i][j] 
= y[i][j];            
        }

    }

}


int main()
{
    
int m;
    
while(scanf("%d%d",&n,&m)!=EOF)
    
{
        
if( m==0 && n==0 )
            
break;
        
int i,j,k;
        
double num[N],r;
        
for(i=0;i<n;i++)//init()
            for(j=0;j<n;j++)
            
{
                
if(i == j)
                    matrix[i][j] 
= 1.0;
                
else
                    matrix[i][j] 
= 0.0;
            }


        
for(i=0;i<n;i++)
            scanf(
"%lf",&num[i]);

        scanf(
"%d",&k);
        
while(k--)
        
{
            scanf(
"%d%d%lf",&i,&j,&r);
            matrix[j][i] 
+= r; //构建初始矩阵
            matrix[i][i] -= r;
        }


        fun(m,z); 
//求矩阵的m次方,结果放在 x 数组中

        r 
= 0.0;
        
for(j=0;j<n;j++)
            r 
+= z[n-1][j] * num[j];
        printf(
"%.0lf\n",r);
    }

    
return 0;
}

/*
3 1
40 20 10
2
0 1 1
1 2 1
3 2
40 20 10
2
0 1 1
1 2 1
*/