Go: package main

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

const NIL = -1

type Node struct {
	id     int
	weight int
}

func init() {
	sc.Split(bufio.ScanWords)
}

type NodeHeap []Node

func (h NodeHeap) Len() int           { return len(h) }
func (h NodeHeap) Less(i, j int) bool { return h[i].weight < h[j].weight }
func (h NodeHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }

func (h *NodeHeap) Push(x interface{}) {
	*h = append(*h, x.(Node))
}

func (h *NodeHeap) Pop() interface{} {
	old := *h
	n := len(old)
	x := old[n-1]
	*h = old[0 : n-1]
	return x
}

var sc = bufio.NewScanner(os.Stdin)

func scanInt() int {
	num, _ := strconv.Atoi(scanString())
	return num
}

func scanString() string {
	sc.Scan()
	return sc.Text()
}

func init() {
	sc.Split(bufio.ScanWords)
}

func main() {
	n := scanInt()

	route := make([][]Node, n)
	weight := make([]int, n)
	for i := 0; i < n; i++ {
		weight[i] = NIL
	}

	for i := 0; i < n; i++ {
		u := scanInt()
		k := scanInt()
		route[i] = make([]Node, k)
		for j := 0; j < k; j++ {
			route[u][j] = Node{id: scanInt(), weight: scanInt()}
		}
	}

	start := Node{id: 0, weight: 0}
	h := &NodeHeap{start}
	heap.Init(h)

	for h.Len() > 0 {
		node := heap.Pop(h).(Node)
		if weight[node.id] != NIL {
			continue
		}
		weight[node.id] = node.weight

		for _, nextNode := range route[node.id] {
			if weight[nextNode.id] != NIL {
				continue
			}
			nextNode.weight += node.weight
			heap.Push(h, nextNode)
		}
	}

	for i, w := range weight {
		fmt.Println(i, w)
	}
}

C++: #include <bits/stdc++.h>

#define rep(i, a, b) for (int i = a; i < (int)(b); ++i)
#define rrep(i, a, b) for (int i = b - 1; i >= (int)(a); --i)

using namespace std;

using ll = long long;
using vi = vector<int>;
using vvi = vector<vi>;
using vll = vector<ll>;

int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);

    int n;
    cin >> n;

    vector<vector<pair<int, int>>> g(n);

    rep(i, 0, n) {
        int u, k;
        cin >> u >> k;

        rep(j, 0, k) {
            int v, c;
            cin >> v >> c;
            g[u].push_back(make_pair(v, c));
        }
    }

    vector<bool> seen(n, false);
    vi ds(n, INT_MAX);
    priority_queue<pair<int, int>> pq;

    ds[0] = 0;
    pq.push(make_pair(0, 0));  // (cost, v)

    while (!pq.empty()) {
        pair<int, int> p = pq.top();
        pq.pop();

        int u = p.second;
        int minv = -p.first;

        if (seen[u]) { continue; }

        seen[u] = true;

        for (auto itr = g[u].begin(); itr != g[u].end(); ++itr) {
            int v = (*itr).first;
            int c = (*itr).second;

            if (!seen[v] && c != INT_MAX && ds[v] > minv + c) {
                ds[v] = minv + c;
                pq.push(make_pair(-ds[v], v));
            }
        }
    }

    rep(i, 0, n) { cout << i << " " << ds[i] << endl; }

    return 0;
}

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

struct edge{int to,cost;};

//pair<int,int> ??????first??????????????¢,second??????????????????

int v;
vector<edge> g[10000];
int d[10000];
const int INF = 10000000;

//s?????????????????????!
void dijkstra(int s){

  priority_queue<pair<int,int>, vector<pair<int,int> >, greater<pair<int,int> > > que;
  fill(d,d+v,INF);
  d[s] = 0;
  que.push(pair<int,int>(0,s));


  while(!que.empty()){
    pair<int,int> p = que.top(); que.pop();
    int k = p.second;
    if(d[k] < p.first) continue;

    for(int i=0; i<g[k].size();i++){
      edge e = g[k][i];
      if(d[e.to] > d[k] + e.cost){
        d[e.to] = d[k] + e.cost;
        que.push(pair<int,int>(d[e.to],e.to));
      }
    }
  }

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

int main(){

    cin >> v;

    int u,k,b,c;

    for(int i=0;i<v;i++){
      cin >> u >> k;
      for(int j=0;j<k;j++){
        cin >> b >> c;
        edge ed;
        ed.to = b;
        ed.cost = c;
        g[i].push_back(ed);
      }
    }

    dijkstra(0);


    return 0;
}

C++: #include<iostream>
using namespace std;
#include<queue>
#include<vector>
#include<string>
#include<string.h>
#include<algorithm>
bool b[2003];

#define REP(i, a) for(int i=0;i<a;i++)
	int N=1000000;
int main()
{
	int min,b,a,k,m[101][101],n ,e,p[101],d[101],u,v; //u ?????????v????????¨
	bool color[101];
	cin>>n;
	REP(i, n) {
		REP(j, n) {
		m[i][j]=N;
		}
	}
	REP(i, n) {
		cin>>u>>k;
		REP(i, k) {
			cin>>a>>b;
			m[u][a]=b;
			if(m[u][a]==-1) m[u][a]=N;
		}
		color[i]=0;
		d[i]=N;
	}
	a=0;
	d[0]=0;
	while(1){
		min=N;
		u=-1;
		REP(i,n){
			if(min>d[i]&&color[i]==0){
				min=d[i];
				u=i;
			}
		}
		if(u==-1) break;
		color[u]=1;
		REP(i,n){
			if(color[i]==0&&m[u][i]!=N){
				if(d[i]>m[u][i]+d[u]){
					d[i]=m[u][i]+d[u];
				}
			}
		}

	}
	min=0;
	REP(i,n){
		cout<<i<<" "<<(d[i] == N ? -1 : d[i])<<endl;
	
	}
	return 0;
}

C++: #include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
static const int MAX = 10000;
static const int INFTY = (1 << 20);
static const int WHITE = 0;
static const int GRAY = 1;
static const int BLACK = 2;

int n;
vector<pair<int, int> > adj[MAX];

void dijkstra() {
	priority_queue<pair<int, int> > PQ;
	int color[MAX];
	int d[MAX];
	for (int i = 0; i < n; i++) {
		d[i] = INFTY;
		color[i] = WHITE;
	}

	d[0] = 0;
	PQ.push(make_pair(0, 0));
	color[0] = GRAY;

	while (!PQ.empty()) {
		pair<int, int> f = PQ.top(); PQ.pop();
		int u = f.second;
		color[u] = BLACK;

		if (d[u] < f.first*(-1)) continue;

		for (unsigned int j = 0; j < adj[u].size(); j++) {
			int v = adj[u][j].first;
			if (color[v] == BLACK) continue;
			if (d[v] > d[u] + adj[u][j].second) {
				d[v] = d[u] + adj[u][j].second;
				PQ.push(make_pair(d[v] * (-1), v));
				color[v] = GRAY;
			}
		}
	}

	for (int i = 0; i < n; i++) {
		cout << i << " " << (d[i] == INFTY ? -1 : d[i]) << endl;
	}
}

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

	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> u >> k;
		for (int j = 0; j < k; j++) {
			cin >> v >> c;
			adj[u].push_back(make_pair(v, c));
		}
	}

	dijkstra();

	return 0;
}

C++: #include <bits/stdc++.h>
using namespace std;
long long INF = 1000000000000000;
vector<long long> dijkstra(vector<vector<pair<int, int>>> &E, int s){
    int V = E.size();
    vector<long long> d(V, INF);
    priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<pair<long long, int>>> Q;
    Q.push(make_pair(0, s));
    while (!Q.empty()){
        long long c = Q.top().first;
        int v = Q.top().second;
        Q.pop();
        if (d[v] == INF){
            d[v] = c;
            for (int i = 0; i < E[v].size(); i++){
                Q.push(make_pair(c + E[v][i].first, E[v][i].second));
            }
        }
    }
    return d;
}
int main(){
    int n;
    cin >> n;
    vector<vector<pair<int, int>>> E(n);
    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].push_back(make_pair(c, v));
        }
    }
    vector<long long> d = dijkstra(E, 0);
    for (int i = 0; i < n; i++){
        cout << i << ' ' << d[i] << endl;
    }
}