Go: package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	r := bufio.NewReader(os.Stdin)

	var n int
	fmt.Fscan(r, &n)
	cs := make([]map[int]int, n) // []v_i -> c_i
	for h := 0; h < n; h++ {
		var u, k int
		fmt.Fscan(r, &u, &k)
		m := make(map[int]int)
		for i := 0; i < k; i++ {
			var v, c int
			fmt.Fscan(r, &v, &c)
			m[v] = c
		}

		cs[u] = m
	}

	q := make(map[int]int)
	q[0] = 0
	visited := make(map[int]struct{})
	out := make([]int, n)

	for len(q) > 0 {
		u := top(q)
		for uu, c := range cs[u] {
			// Consider the connection between u and uu.
			if _, ok := visited[uu]; ok {
				continue
			}
			if d, ok := q[uu]; !ok || d > q[u]+c {
				q[uu] = q[u] + c
			}
		}

		out[u] = q[u]
		delete(q, u)
		visited[u] = struct{}{}
	}

	for u, d := range out {
		fmt.Println(u, d)
	}
}

func top(q map[int]int) int {
	minu := -1
	min := -1
	for u, d := range q {
		if min < 0 || d < min {
			minu = u
			min = d
		}
	}

	return minu
}

C++: // #include {{{
#include <array>
#include <vector>
#include <deque>
#include <queue>
#include <set>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <string>
#include <algorithm>
#include <numeric>
#include <functional>
#include <iterator>
#include <tuple>
#include <utility>
#include <random>
#include <limits>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cstdint>
#include <cassert>
// }}}

using namespace std;

// macros {{{
template<typename T, size_t N>
constexpr size_t NELEMS(T (&)[N]) { return N; }

template<typename InputIt>
void PRINT_RANGE(InputIt first, InputIt last)
{
    for(; first != last; ++first)
        cout << *first << (first==last ? "" : " ");
    cout << "\n";
}

template<typename T>
void PRINT_MATRIX(T mat, size_t nr, size_t nc)
{
    for(size_t r = 0; r < nr; ++r) {
        for(size_t c = 0; c < nc; ++c) {
            cout << mat[r][c] << (c==nc-1 ? "" : " ");
        }
        cout << "\n";
    }
}

#define FOR(i, start, end) for(int i = (start); i < (end); ++i)
#define REP(i, n) FOR(i, 0, n)
// }}}

// types {{{
using ll  = long long;
using ull = unsigned long long;
// }}}

constexpr int INF = numeric_limits<int>::max();

int N;
int G[100][100];

void solve()
{
    vector<int> cost(N);
    deque<bool> done(N);

    fill(begin(cost), end(cost), INF);
    cost[0] = 0;

    for(;;) {
        int mincost = INF;
        int minv    = -1;

        REP(v, N) {
            if(done[v]) continue;
            if(cost[v] < mincost) {
                mincost = cost[v];
                minv    = v;
            }
        }

        if(minv == -1) break;

        done[minv] = true;

        REP(v, N) {
            if(done[v]) continue;
            if(G[minv][v] == -1) continue;
            int cost_new = cost[minv] + G[minv][v];
            if(cost_new < cost[v]) {
                cost[v] = cost_new;
            }
        }
    }

    REP(v, N) {
        cout << v << " " << cost[v] << "\n";
    }
}

int main()
{
    cin >> N;
    REP(from, N) {
        REP(to, N) {
            G[from][to] = -1;
        }
    }

    REP(_, N) {
        int from, k;
        cin >> from >> k;
        REP(_, k) {
            int cost, to;
            cin >> to >> cost;
            G[from][to] = cost;
        }
    }

    solve();

    return 0;
}

C++: #include <iostream>
using namespace std;

#define M 100
#define WHITE 1
#define BLACK 2
#define GRAY 3
#define INFTY (1<<21)

int n,A[M][M];

void dic(){
  int d[M],p[M],min,color[M],u;

  for(int i = 0;i < n;i++){
    color[i] = WHITE;
    d[i] = INFTY;
  }
  d[0] = 0;
  color[0] = GRAY;

  while(1){
    min = INFTY;
    for(int i = 0;i < n;i++){
      if(color[i] != BLACK && d[i] < min){
	min = d[i];
	u = i;
      }
    }
    if(min == INFTY) break;

    color[u] = BLACK;

    for(int i = 0;i < n;i++){
      if(color[i] != BLACK && A[u][i] != INFTY){
	if(d[u] + A[u][i] < d[i]){
	  d[i] = d[u] + A[u][i];
	  p[i] = u;
	  color[i] = GRAY;
	}
      }
    }
  }
  for(int i = 0;i < n;i++){
    cout << i << " ";
    if(d[i] != INFTY) cout << d[i];
    else cout << -1;
    cout << endl;
  }
}

int main(){
  int s,t,u,v;
    
  cin >> n;
  for(int i = 0;i < n;i++){
    for(int j = 0;j < n;j++){
      A[i][j] = INFTY;
    }
  }

  for(int i = 0;i < n;i++){
    cin >> s >> t;
    for(int j = 0;j < t;j++){
      cin >> u >> v;
      A[s][u] = v;
    }
  }

  dic();

  return 0;
}

C++: #include <bits/stdc++.h>
using namespace std;

#define MAX 100
#define WHITE 0
#define GRAY 1
#define BLACK 2

void dijkstra(void);

int n;
int M[MAX][MAX];

int main(){
  int i,j;
  int k,c,u,v;
  cin >> n;
  for( i = 0; i < n; i++){
    for(j = 0; j < n; j++){
      M[i][j] = INFINITY;
    }
  }
  for(i = 0; i < n; i++){
    cin >> u;
    cin >> k;
    for(j = 0; j < k; j++){
      cin >> v;
      cin >> c;
      M[u][v] = c;
    }
  }
  dijkstra();
  return 0;
}

void dijkstra(){
  int minV;
  int d[MAX],color[MAX];
  int u,v;
  int i;
  for(i = 0; i < n; i++){
    d[i] = INFINITY;
    color[i] = WHITE;
  }
  d[0] = 0;
  color[0] = GRAY;
  while(1){
    minV = INFINITY;
    u = -1;
    for(i = 0; i < n; i++){
      if(minV > d[i] && color[i] != BLACK){
        u =i;
        minV = d[i];
      }
    }
    if(u == -1){
      break;
    }
    color[u] = BLACK;
    for(v = 0; v < n; v++){
      if(color[v] != BLACK && M[u][v] != INFINITY){
        if(d[v] > d[u] + M[u][v]){
          d[v] = d[u] + M[u][v];
          color[v] = GRAY;
        }
      }
    }
  }
  for(i = 0; i < n; i++){
    cout << i << " " << (d[i] == INFINITY ? -1 : d[i]) << endl;
  }
}

C++: #define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;

#define REP(i,n) for(int i=0;(i)<(n);(i)++)

static const int INFTY = (1 << 29);
static const int WHITE = 0; //?????¢?´¢
static const int GRAY = 1; //??¢?´¢??????
static const int BLACK = 2; //?¨??????????

int n, M[101][101];

void dijkstra(void) {
	int dist[101]; //?§????????????????i????§????????????????????????????
	int color[101]; //?¨??????¶???(???or??°or???)

	//?????????????????§?????????????¨??????¶???????????§?????????
	REP(i, n) {
		dist[i] = INFTY;
		color[i] = WHITE;
	}

	dist[0] = 0; //?§????0??????0?????§???????????????0
	color[0] = GRAY; //0?????¢?´¢??????	

	//?????¢?´¢???????????????????????????????°??????????????§????????????????????????´??°????????????
	int minCost;
	while (true) {
		minCost = INFTY; //????°??????????????????????
		int minNode = -1; //????°?????????????????????????????????????
		REP(i, n) {
			if (minCost > dist[i] && color[i] != BLACK) {
				minNode = i;
				minCost = dist[i];
			}
		}
		if (minNode == -1) break; //-1???????????¨???????????¨????????????????????????????????£?????¨???????????¨

		color[minNode] = BLACK; //????°??????????????????????????§??????????????¨???????????????????

		//??¢?´¢????????????????????????????????´??°??????
		REP(v, n) {
			if (color[v] != BLACK && M[minNode][v] != INFTY) {
				if (dist[v] > dist[minNode] + M[minNode][v]) {
					dist[v] = dist[minNode] + M[minNode][v];
					color[v] = GRAY;
				}
			}
		}
	}
	
	REP(i, n) {
		cout << i << " " << (dist[i] == INFTY ? -1 : dist[i]) << endl;
	}

}

int main() {
	cin >> n;

	//??£??\???????????????????????§?????????
	REP(i, n) {
		REP(j, n) {
			M[i][j] = INFTY;
		}
	}

	//??£??\??????????????????
	int u, k, v, c;
	REP(i, n) {
		cin >> u >> k;
		REP(j, k) {
			cin >> v >> c;
			M[u][v] = c;
		}
	}

	dijkstra();

	
	return 0;
}