Go: package main

import (
	"strconv"
	"fmt"
	"bufio"
	"os"
)
const INF = 1 << 21
var scanner = bufio.NewScanner(os.Stdin)

func nextInt() int {
	scanner.Scan()
	i, e := strconv.Atoi(scanner.Text())
	if e != nil {
		panic(e)
	}
	return i
}


func main() {
	scanner.Split(bufio.ScanWords)
	n := nextInt()
	adj := make([][]int, n)
	for i := range adj {
		adj[i] = make([]int, n)
	}

	for i := 0;i < n; i++ {
		u := nextInt()
		k := nextInt()
		for j := 0; j < k; j++ {
			v := nextInt()
			c := nextInt()
			adj[u][v] = c
		}
	}

	// for i := range adj {
	// 	fmt.Println(adj[i])
	// }

	dist := make([]int, n)
	prev := make([]int, n)
	visited := make([]bool, n)
	dijkstra := func(start int, size int) {
		for i := 0; i < size; i++ {
			dist[i] = INF
			prev[i] = -1
			visited[i] = false
		}
		dist[start] = 0
		for {
			u := -1
			tmp_min := INF
			for i := 0; i < size; i++ {
				if visited[i] == false && dist[i] < tmp_min {
					tmp_min = dist[i]
					u = i
				}
			}
			if u == -1 {
				break
			}
			visited[u] = true
			for i := 0; i < size; i++ {
				if adj[u][i] > 0 {
					w := adj[u][i]
					newlen := dist[u] + w
					if newlen < dist[i] {
						dist[i] = newlen
						prev[i] = u
					}
				}
			}
		}
	}
	dijkstra(0, n)
	for i, cost := range dist {
		fmt.Printf("%d %d\n", i, cost)
	}
}

C++: #include <iostream>
using namespace std;
static const int MAX = 100;
static const int INFTY = (1 << 21);
static const int WHITE = 0;
static const int GRAY = 1;
static const int BLACK = 2;
int n, M[MAX][MAX];

void dijkstra(int s)
{
    int u, minv;
    int color[MAX], d[MAX], p[MAX];
    for (int i = 0; i != n; ++i)
    {
        color[i] = WHITE;
        d[i] = INFTY;
        p[i] = -1;
    }
    d[s] = 0;
    while (true)
    {
        minv = INFTY;
        for (int i = 0; i != n; ++i)
        {
            if (color[i] != BLACK && d[i] < minv)
            {
                u = i;
                minv = d[i];
            }
        }
        if (minv == INFTY)
        {
            break;
        }
        color[u] = BLACK;
        for (int v = 0; v != n; ++v)
        {
            if (M[u][v] != INFTY && color[v] != BLACK)
            {
                if (d[u] + M[u][v] < d[v])
                {
                    d[v] = d[u] + M[u][v];
                    color[v] = GRAY;
                    p[v] = u;
                }
            }
        }
    }
    for (int i = 0; i != n; ++i)
    {
        cout << i << " " << d[i] << 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] = INFTY;
        }
    }
    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(0);
    return 0;
}

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

template<typename A, size_t N, typename T>
void Fill(A (&array)[N], const T &val) {
  std::fill((T*)array, (T*)(array + N), val);
}

const int INF = (1 << 21);

int n;
int m[100][100];

void dijikstra()
{
  int minv;
  int d[100], color[100];

  fill(d, d + 100, INF);
  fill(color, color + 100, 0);

  d[0] = 0;
  color[0] = 1;
  while (true) {
    minv = INF;
    int u = -1;
    for (int i = 0; i < n; i++) {
      if (minv > d[i] && color[i] != 2) {
        u = i;
        minv = d[i];
      }
    }
  
    if (u == -1) break;
    color[u] = 2;
  
    for (int v = 0; v < n; v++) {
      if (color[v] != 2 && m[u][v] != INF) {
        if (d[v] > d[u] + m[u][v]) {
          d[v] = d[u] + m[u][v];
          color[v] = 1;
        }
      }
    }
  }
  
  for (int i = 0; i < n; i++) {
    cout << i << " " << (d[i] == INF ? -1 : d[i]) << endl;
  }
}

signed main()
{
  int k, u, v, c;

  Fill(m, INF);

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

  dijikstra();

  return (0);
}

C++: #include <cstdio>
static const int INFTY = (1 << 21);
static const int WHITE = 0;
static const int GRAY = 1;
static const int BLACK = 2;

int n, **M;
int *d, *p;

void dijkstra() {
    int u, minv;
    int d[n], p[n], color[n];

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

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

        if (u == -1) { break; }

        color[u] = BLACK;
        for (int v = 0; v < n; v++) {
            if (color[v] != BLACK && M[u][v] != INFTY) {
                // printf("d[%d] = %d, M[%d][%d] = %d, d[%d] = %d\n", u, d[u], u, v, M[u][v], v, d[v]);
                if (d[u] + M[u][v] < d[v]) {
                    p[v] = u;
                    d[v] = d[u] + M[u][v];
                    color[v] = GRAY;
                }             
            }
        }
    }
    
    for (int i = 0; i < n; i++) {
        printf("%d %d\n", i, d[i]);
    }
}

int main() {
    scanf("%d", &n);

    M = new int*[n];
    for (int i = 0; i < n; i++) {
        M[i] = new int[n];
        for (int j = 0; j < n; j++) {
            M[i][j] = INFTY;
        }
    }

    for (int i = 0; i < n; i++) {
        int u, k;
        scanf("%d %d", &u, &k);
        for (int j = 0; j < k; j++) {
            int v, c;
            scanf("%d %d", &v, &c);
            M[u][v] = c;
            printf("");
        }
    }

    dijkstra();

    return 0;
}

C++: #include<bits/stdc++.h>
using namespace std;
static const int MAX = 100; 
int n,M[MAX][MAX];
void dij(){
	int minv;
	int d[MAX],color[MAX];
	for(int i = 0;i < n;i++){
		d[i] = INT_MAX;
		color[i] = 0;
	}
	d[0] = 0;
	color[0] = 1;
	while(1){
		minv = INT_MAX;
		int u = -1;
		for(int i = 0;i < n;i++){
			if(minv > d[i] && color[i] != 2){
				u = i;
				minv = d[i];
			}
		}
		if(u == -1)break;
		color[u] = 2;
		for(int v = 0; v < n; v++){
			if(color[v] != 2 && M[u][v] != INT_MAX){
				if(d[v] > d[u] + M[u][v]){
					d[v] = d[u] + M[u][v];
					color[v] = 1;
				}
			}
		}
	}
	for(int i = 0;i < n;i++){
		cout << i << " " << (d[i] == INT_MAX ? -1 : d[i]) << endl;
	}
}
int main(){
	cin >> n;
	for(int i = 0;i < n;i++){
		for(int k = 0;k < n;k++){
			M[i][k] = INT_MAX;
		}
	}
	int k, c, u,v;
	for(int i = 0;i < n;i++){
		cin >> u >> k;
		for(int j = 0;j < k;j++){
			cin >> v >> c;
			M[u][v] = c;
		}
	}
	dij();
}