Go: package main

import (
	"bufio"
	"container/heap"
	"fmt"
	"os"
	"strconv"
)

//make priority queue
type Item struct {
	id       int
	priority int // this state is priority and distans from start
	index    int
}

type PriorityQueue []*Item

func (pq PriorityQueue) Len() int { return len(pq) }

// we want the ascending-priority-queue.
// So we use less than here.
func (pq PriorityQueue) Less(i, j int) bool {
	return pq[i].priority < pq[j].priority
}

func (pq PriorityQueue) Swap(i, j int) {
	pq[i], pq[j] = pq[j], pq[i]
	pq[i].index = j
	pq[j].index = i
}

func (pq *PriorityQueue) Push(x interface{}) {
	n := len(*pq)
	item := x.(*Item)
	item.index = n
	*pq = append(*pq, item)
}

func (pq *PriorityQueue) Pop() interface{} {
	old := *pq
	n := len(old)
	item := old[n-1]
	item.index = -1 //for safety
	*pq = old[0 : n-1]
	return item
}

func (pq *PriorityQueue) update(dist int, id int) {
	for _, i := range *pq {
		if i.id == id {
			if i.priority > dist {
				i.priority = dist
			}
		}
	}
}

// the main code
func nextInt(sc *bufio.Scanner) int {
	sc.Scan()
	n, _ := strconv.Atoi(sc.Text())
	return n
}

func dikstra(dist [][]int, n int) []int {
	// preparate priority queue
	inf := 1 << 30
	pq := make(PriorityQueue, n)
	shortests := make([]int, n)
	for i := 0; i < n; i++ {
		pq[i] = &Item{
			id:       i,
			priority: inf,
			index:    i,
		}

		shortests[i] = inf
	}
	pq[0].priority = 0
	shortests[0] = 0
	heap.Init(&pq)

	for pq.Len() > 0 {
		item := heap.Pop(&pq).(*Item)
		shortests[item.id] = item.priority
		for id, d := range dist[item.id] {
			if d != -1 {
				pq.update(item.priority+d, id)
			}
		}
		heap.Init(&pq)
	}
	return shortests
}

func main() {
	sc := bufio.NewScanner(os.Stdin)
	sc.Split(bufio.ScanWords)

	// init
	n := nextInt(sc)
	dist := make([][]int, n)
	for i := 0; i < n; i++ {
		dist[i] = make([]int, n)
		for j := 0; j < n; j++ {
			dist[i][j] = -1
		}
	}

	// std Input
	for i := 0; i < n; i++ {
		u := nextInt(sc)
		k := nextInt(sc)
		for j := 0; j < k; j++ {
			v, c := nextInt(sc), nextInt(sc)
			dist[u][v] = c
		}
	}

	shortests := dikstra(dist, n)
	for i, d := range shortests {
		fmt.Printf("%d %d\n", i, d)
	}
}

C++: #include<iostream>
int main(){
  int u,k,C,V,D[1000][1000],n;
  std::cin >> n;
  for(int i=0;i<n;i++)for(int j=0;j<n;j++)D[i][j] = 200001;
  for(int i=0;i<n;i++){     std::cin >> u >> k;
    for(int j=0;j<k;j++){   std::cin >> V >> C;
      D[u][V] = C;}}
  for(int i=0;i<n;i++)D[i][i] = 0;
  for(int k=0;k<n;k++)for(int i=0;i<n;i++)for(int j=0;j<n;j++)D[i][j]= std::min(D[i][j],D[i][k] + D[k][j]);
  for(int i=0;i<n;i++)std::cout << i << " " << D[0][i] << std::endl;
  return 0;
}

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

using namespace std;

class Node {
public:
	int p, d = -1;
};

class Edge {
public:
	int v, u, d;
};

int n, V[100], e = 0;
Edge E[5000];

void Path() {
	V[0] = 0; for (int i = 1; i < n; i++)  V[i] = -1;
	for (int a = 1; a < e; a++) {
		for (int i = 0; i < e; i++) {
			if (V[E[i].u] == -1 && V[E[i].v] != -1 || V[E[i].u] > V[E[i].v] + E[i].d && V[E[i].v] != -1) {
				V[E[i].u] = V[E[i].v] + E[i].d;
			}
		}
	}
}

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

	Path();

	for (int i = 0; i < n; i++) cout << i << " " << V[i] << endl;
}

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

#define MAX_VERTEX 100
#define INF 1000000

int vertex_num; // ???????????°
int d[MAX_VERTEX][MAX_VERTEX];  // ???????????¢???d[?§????][??????]??§?§??????????????????????????????¢?????¨???

void Input() {
  cin >> vertex_num;

  // (a1) ??\???????????¶??§?????????
  // d?????¨???INF?????????????§??????¨????????????????????´???0
  for (int i = 0; i < vertex_num; i++){
	  for (int j = 0; j < vertex_num; j++){
		  if(i==j){
		  	d[i][j]=0;
		  	}else{
		  	d[i][j]=INF;
		  	}
	  }
  }

  for (int i = 0; i < vertex_num; i++) {
    int vertex, out;
    cin >> vertex >> out;
    for(int j = 0; j < out; j++) {
      int to, c;
      cin >> to >> c;
      d[vertex][to] = c;
    }
  }
}

void WarshallFloyd() {
	// (b1)?§£??¬?????????????????????
	for (int k = 0; k < vertex_num; k++){
		for (int i = 0; i < vertex_num; i++){
			for (int j = 0; j < vertex_num; j++){
				d[i][j] = min(d[i][j],d[i][k]+d[k][j]);
			}
		}

	}
}

void Output() {
  for(int i = 0; i < vertex_num; i++) {
    cout << i << " " << d[0][i] << endl;
  }
}

int main() {

  Input();
  WarshallFloyd();
  Output();

  return 0;
}

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

static const int N = 100;
static const int INF = (1 << 30);
static const int WHITE = 0;
static const int GRAY  = 1;
static const int BLACK = 2;

int n;
int m[N][N];

void dijkstra(){
    int min_val;
    int d[N],color[N];

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

    //始点設定
    d[0] = 0;
    color[0] = GRAY;

    while(1){
        min_val = INF;
        int u = -1;
        for(int i=0;i<n;i++){
            if(min_val > d[i] && color[i] != BLACK){
                u = i;
                min_val = d[i];
            }
        }

        if(u == -1) break;

        color[u] = BLACK;
        for(int v=0;v<n;v++){
            if(color[v] != BLACK && m[u][v] != INF){
                if(d[v] > d[u]+m[u][v]){
                    d[v] = d[u]+m[u][v];
                    color[v] = GRAY;
                }
            }
        }
    }

    for(int i=0;i<n;i++){
        cout << i << ' ';
        if(d[i] == INF)
            cout << -1;
        else
            cout << d[i];
        cout << endl;
    }

}

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

    for(int i=0;i<n;i++){
        cin >> u >> k;
        for(int j=0;j<k;j++){
            cin >> v >> c;
            m[u][v] = c;
        }
    }

    dijkstra();

}

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

const int MAX = 105;
const int WHITE = 0;
const int GRAY = 1;
const int BLACK = 2;
const int INFTY = (1 << 21);
int n, M[MAX][MAX];
int color[MAX];
int d[MAX];
int p[MAX];

void dijkstra(int root) {
  int u = -1;
  for (int i = 0; i < n; i++) {
    color[i] = WHITE;
    d[i] = INFTY;
    p[i] = -1;
  }

  color[root] = GRAY;
  d[root] = 0;

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

    if (min_cost == INFTY) {
      break;
    }

    color[u] = BLACK;

    for (int i = 0; i < n; i++) {
      if (color[i] != BLACK && d[i] > M[u][i] + d[u]) {
        d[i] = d[u] + M[u][i];
        p[i] = u;
        color[i] = GRAY;
      }
    }
  }
}

int main() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      M[i][j] = INFTY;
    }
  }
  int k, s, t, c;
  for (int i = 0; i < n; i++) {
    cin >> s >> k;
    for (int j = 0; j < k; j++) {
      cin >> t >> c;
      M[s][t] = c;
    }
  }
  dijkstra(0);
  for (int i = 0; i < n; i++) {
    cout << i << " " << d[i] << endl;
  }
  return 0;
}