#include <bits/stdc++.h> 
using namespace std ; 
namespace hater_space { 

#define fp( i , x , y ) for( int i=(x); i<=(y); ++i ) 
#define fq( i , x , y ) for( int i=(y); i>=(x); --i ) 
#define i60 long long 
#define dou double 
#define IL inline 
const int N = 5e5+10 , mod = 998244353 ;   
int n , m , q , di[N] , sz[N] , son[N] , pre[N] , d[N] , top[N] ;   
vector <int> v[N] , edg[N] ;  
void dfs1( int x , int fa ) { 
  pre[x] = fa ; sz[x] = 1 ; 
  d[x] = d[fa] + 1 ; 
  int y , z , l = v[x].size() ; 
  fp( i , 1 , l ) { 
    y = v[x][i-1] ; z = edg[x][i-1] ; 
    if( y == fa ) continue ; 
    di[y] = ( di[x] + z ) % mod ; 
    dfs1( y , x ) ; 
    sz[x] += sz[y] ; 
    if( sz[son[x]] < sz[y] ) 
      son[x] = y ; 
  } 
} 
void dfs2( int x ) { 
  if( son[x] ) { 
    top[son[x]] = top[x] , dfs2( son[x] ) ; 
  } 
  for( auto y : v[x] ) { 
    if( y == pre[x] || y == son[x] ) continue ; 
    top[y] = y ; dfs2( y ) ; 
  } 
} 
void add( int x , int y , int z ) { 
  v[x].push_back(y) ; edg[x].push_back(z) ; 
} 
int lca( int x , int y ) { 
  int fx = top[x] , fy = top[y] ; 
  while( fx != fy ) { 
    if( d[fx] < d[fy] ) swap( x , y ) , swap( fx , fy ) ; 
    x = pre[fx] ; fx = top[x] ; 
  } 
  return d[x] < d[y] ? x : y ; 
} 
void sub( ) { 
  int x , y , z ;  
  fp( i , 1 , m ) { 
    cin >> x >> y >> z ; 
    add( x , y , z ) ; add( y , x , z ) ; 
  } 
  dfs1( 1 , 0 ) ; 
  top[1] = 1 ; 
  dfs2( 1 ) ; 
  while( q -- ) { 
    cin >> x >> y ; 
    z = lca( x , y ) ; 
    cout << ( ( di[x] + di[y] ) % mod + mod - 2ll * di[z] % mod ) % mod << '\n' ;  
  } 
} 
int main( ) { 
  freopen( "simple.in" , "r" , stdin ) ; 
  freopen( "simple.out" , "w" , stdout ) ; 
  ios::sync_with_stdio(false) ; 
  cin.tie(0) ;  
  cin >> n >> m >> q ; 
  if( m < n ) { sub( ) ; return 0 ; } 
  return 0 ;  
} 

} 
int main( ) { 
  hater_space::main( ) ;   
  return 0 ; 
} 


