Go: package main

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

// I/O
type Scanner struct {
	sc *bufio.Scanner
}

func NewScanner() *Scanner {
	sc := bufio.NewScanner(os.Stdin)
	sc.Split(bufio.ScanWords)
	sc.Buffer(make([]byte, 1024), int(1e+9))
	return &Scanner{sc}
}

func (s *Scanner) nextStr() string {
	s.sc.Scan()
	return s.sc.Text()
}

func (s *Scanner) nextInt() int {
	i, e := strconv.Atoi(s.nextStr())
	if e != nil {
		panic(e)
	}
	return i
}

func (s *Scanner) nextFloat() float64 {
	f, e := strconv.ParseFloat(s.nextStr(), 64)
	if e != nil {
		panic(e)
	}
	return f
}

func (s *Scanner) nextRuneSlice() []rune {
	return []rune(s.nextStr())
}

func (s *Scanner) nextIntSlice(n int) []int {
	res := make([]int, n)
	for i := 0; i < n; i++ {
		res[i] = s.nextInt()
	}
	return res
}

func (s *Scanner) nextFloatSlice(n int) []float64 {
	res := make([]float64, n)
	for i := 0; i < n; i++ {
		res[i] = s.nextFloat()
	}
	return res
}

// Arithmetic
func max(nums ...int) int {
	m := nums[0]
	for _, i := range nums {
		if m < i {
			m = i
		}
	}
	return m
}

func min(nums ...int) int {
	m := nums[0]
	for _, i := range nums {
		if m > i {
			m = i
		}
	}
	return m
}

func abs(x int) int {
	if x > 0 {
		return x
	}
	return -x
}

func pow(x, y int) int {
	res := 1
	for i := 0; i < y; i++ {
		res *= x
	}
	return res
}

func ceil(a, b int) int {
	if a%b == 0 {
		return a / b
	} else {
		return a/b + 1
	}
}

// Sort
type RuneSlice []rune

func (a RuneSlice) Len() int           { return len(a) }
func (a RuneSlice) Less(i, j int) bool { return a[i] < a[j] }
func (a RuneSlice) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }

// Main
type Node struct {
	cost int
	done bool
}

type Edge struct {
	to, cost int
}

const INF = 1 << 60

func main() {
	sc := NewScanner()
	wtr := bufio.NewWriter(os.Stdout)
	N := sc.nextInt()
	nodes := make([]Node, N)
	for i := 0; i < N; i++ {
		nodes[i].cost = INF
	}
	E := make([][]Edge, N)
	for i := 0; i < N; i++ {
		id, k := sc.nextInt(), sc.nextInt()
		for j := 0; j < k; j++ {
			to, cost := sc.nextInt(), sc.nextInt()
			E[id] = append(E[id], Edge{to, cost})
		}
	}
	nodes[0].cost = 0
	for {
		cur := 0
		minCost := INF
		for i := 0; i < N; i++ {
			n := nodes[i]
			if !n.done && n.cost < minCost {
				cur = i
				minCost = n.cost
			}
		}
		if minCost == INF {
			break
		}
		nodes[cur].done = true
		for i := 0; i < len(E[cur]); i++ {
			to, cost := E[cur][i].to, E[cur][i].cost+nodes[cur].cost
			if !nodes[to].done && cost < nodes[to].cost {
				nodes[to].cost = cost
			}
		}
	}

	for i := 0; i < N; i++ {
		fmt.Fprintln(wtr, i, nodes[i].cost)
	}
	wtr.Flush()
}

C++: #include <iostream>
#include <vector>

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

const int SIZE = 101;
const int INF = 1 << 21;
int d[SIZE], p[SIZE], state[SIZE];

void dijkstra(int s, int n, int **a) {
  rep(i, n) {
    d[i] = INF;
    p[i] = -1;
  }
  d[s] = 0;

  while (1) {
    int u = -1, minv = INF;
    rep(i, n) {
      if (d[i] < minv && state[i] != 1) {
        u = i;
        minv = d[i];
      }
    }

    if (u == -1) break;

    state[u] = 1;

    rep(i, n) {
      if (a[u][i] != INF) {
        int v = i, w = a[u][i];
        if (state[v] == 1) continue;
        if (d[v] > d[u] + w) { d[v] = d[u] + w; }
      }
    }
  }
}

int main() {
  int n;
  std::cin >> n;
  int **a = new int *[n];
  rep(i, n) a[i] = new int[n];

  rep(i, n) rep(j, n) a[i][j] = INF;

  rep(i, n) {
    int u, k, v, c;
    std::cin >> u >> k;
    rep(j, k) {
      std::cin >> v >> c;
      a[u][v] = c;
    }
  }

  dijkstra(0, n, a);
  rep(i, n) { std::cout << i << ' ' << d[i] << '\n'; }

  return 0;
}

C++: #include <bits/stdc++.h>
using namespace std;
#define inf 1e9+100

int n, u, k, v, c, d[100];
vector<pair<int,int> > e[100];

void dijkstra(int n, vector<pair<int,int> > e[], int *d, int s) {
	priority_queue<pair<int,int>, vector<pair<int,int> >, greater<pair<int,int> > > que;
	fill(d, d+n, inf), d[s] = 0;
	que.push({0,s});
	while(!que.empty()) {
		int v = que.top().second, dis = que.top().first; que.pop();
		if (d[v]<dis) continue;
		for (int i = 0; i < e[v].size(); ++i) {
			int to = e[v][i].first, cost = e[v][i].second;
			if (d[to] > d[v] + cost) {
				d[to] = d[v] + cost;
				que.push({d[to], to});
			}
		}
	}
}

int main() {
	cin >> n;
	for (int i = 0; i < n; ++i) {
		cin >> u >> k;
		for (int j = 0; j < k; ++j) {
			cin >> v >> c;
			e[u].push_back({v, c});
		}
	}
	dijkstra(n,e,d,0);
	for (int i = 0; i < n; ++i) cout << i << ' ' << d[i] << endl;
}

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

#define int long long

int e[111][111],d[111];
int used[111];

signed main(){
  int n;
  cin >> n;
  int INF=1LL<<55LL;
  for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
      e[i][j] = INF;
  for(int i=0;i<n;i++){
    int u, k;
    cin >> u >> k;
    for(int j=0;j<k;j++){
      int v,c;
      cin>>v>>c;
      e[u][v]=min(e[u][v],c);
    }
  }
  memset(used,0,sizeof(used));
  for(int i=0;i<n;i++) d[i]=INF;
  d[0]=0;
  while(1){
    int u=-1;
    for(int i=0;i<n;i++){
      if(used[i]) continue;
      if(d[i]==INF) continue;
      if(u<0||d[i]<d[u]) u=i;
    }
    if(u<0) break;
    used[u]=1;
    for(int i=0;i<n;i++)
      d[i]=min(d[i],d[u]+e[u][i]);
    
  }
  for(int i=0;i<n;i++) cout<<i<<" "<< d[i] << endl;
  return 0;
}

C++: // ref: p302

using System;

public class SingleSourceShortestPath
{
	const int MAX = 100;
	const int INFTY = Int32.MaxValue;
	const int WHITE = 0;
	const int GRAY = 1;
	const int BLACK = 2;

	static int vertexNum; // ????????° = V
	static int[,] M = new int[MAX,MAX]; // ????????????????¨????????????£??\??????

	static void dijkstra() {
		int minv;
		int[] d = new int[MAX]; // ?§????s????????????v?????§??????????????????????¨????
		int[] color = new int[MAX]; // ?¨??????¶???????????§??¨???

		// ?????????
		for (int i = 0; i < vertexNum; i++) {
			d[i] = INFTY;
			color[i] = WHITE; 
		}

		// ????????????????????????
		d[0] = 0;
		color[0] = GRAY;

		while (true) {
			minv = INFTY;
			int u = -1;
			for (int i = 0; i < vertexNum; i++) {
				// ???????¨???????????????????????????´???
				if (minv > d[i] && color[i] != BLACK) {
					u = i;
					minv = d[i]; //????°???????????????´??°
				}
			}
			// ???????????¢?´¢?????????????????????
			if (u == -1)
				break;
			// ?¨????????????????????????´
			color[u] = BLACK;

			for (int v = 0; v < vertexNum; v++) {
				//???????¨?????????????????????????u??¨v?????????????????????
				if (color[v] != BLACK && M[u,v] != INFTY) {
					if (d[v] > d[u] + M[u,v]) {
						d[v] = d[u] + M[u,v];
						color[v] = GRAY;
					}
				}
			}
		}
		// ????????¨?????????????????????
		for (int i = 0; i < vertexNum; i++) {
			Console.WriteLine ("{0} {1}", i, (d[i] == INFTY ? -1 : d[i]));
		}
	}
	public static void Main(String[] args) {
		// ????????°
		vertexNum = int.Parse(Console.ReadLine ());
		// ??????????????????
		for (int i = 0; i < vertexNum; i++) {
			for (int j = 0; j < vertexNum; j++) {
				M[i,j] = INFTY;
			}
		}

		int k, c, u, v;
		for (int i = 0; i < vertexNum; i++) {
			string[] readLine = Console.ReadLine().Split(' ');
			int s = 0;
			u = int.Parse(readLine[s]);	// ????????????
			s++;
			k = int.Parse(readLine[s]); 	// ????¬???°
			for (int j = 0; j < k; j++) {
				s++;
				v = int.Parse(readLine[s]);	// ??£??\?????????????????????
				s++;
				c = int.Parse(readLine[s]); // u??¨v????????????????????????
				M[u, v] = c;
			}
		}
		dijkstra ();
	}
}