Go: package main

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

type Node struct {
	Id int
	Dis int
}

type PriorityQueue []*Node

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

func (pq PriorityQueue) Less(i, j int) bool {
	return pq[i].Dis < pq[j].Dis
}

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

func (pq *PriorityQueue) Push(x interface{}) {
	*pq = append(*pq, x.(*Node))
}

func (pq *PriorityQueue) Pop() interface{} {
	n := len(*pq)
	pop := (*pq)[n-1]
	*pq = (*pq)[0:n-1]
	return pop
}

func main() {
	var n int
	fmt.Scan(&n)

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

	g := make([][]int, n)
	c := make([][]int, n)
	pq := make(PriorityQueue, 0, n)
	d := make([]int, n)
	for i := 0; i < n; i++ {
		sc.Scan()
		u, _ := strconv.Atoi(sc.Text())
		sc.Scan()
		k, _ := strconv.Atoi(sc.Text())
		g[u] = make([]int, k)
		c[u] = make([]int, k)
		for j := 0; j < k; j++ {
			sc.Scan()
			g[u][j], _ = strconv.Atoi(sc.Text())
			sc.Scan()
			c[u][j], _ = strconv.Atoi(sc.Text())
		}

		if u == 0 {
			d[u] = 0
		} else {
			d[u] = 1 << 30
		}
		pq.Push(&Node{u, d[u]})
	}
	heap.Init(&pq)

	for pq.Len() > 0 {
		node := heap.Pop(&pq).(*Node)
		for i := 0; i < len(g[node.Id]); i++ {
			nextId := g[node.Id][i]
			nextDis := node.Dis + c[node.Id][i]
			if nextDis < d[nextId] {
				d[nextId] = nextDis
				heap.Push(&pq, &Node{nextId, nextDis})
			}
		}
	}

	wr := bufio.NewWriter(os.Stdout)
	for i := 0; i < n; i++ {
		wr.WriteString(strconv.Itoa(i))
		wr.WriteString(" ")
		wr.WriteString(strconv.Itoa(d[i]))
		wr.WriteString("\n")
	}
	wr.Flush()
}

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(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++: #define _CRT_SECURE_NO_WARNINGS

#include<iostream>
#include<functional>
#include<algorithm>
#include<stack>
#include<queue>
#include<iomanip>
#include<set>
#include<map>
#include<utility>
#include<string>
#include<vector>

using namespace std;

#define LL long long
const int dx[4] = { 1,-1,0,0 };
const int dy[4] = { 0,0,1,-1 };
bool OOA(int x, int y, int H, int W) { return (0 <= x && x<H) && (0 <= y && y<W); }

struct Edge{
	int fr,to,val;
	bool operator < (Edge x){
		return (val<x.val);
	}
};

struct Graph {
	struct Edge {
		int fr, to, val;
		Edge(int f, int t, int v) :fr(f), to(t), val(v) {}
	};

	int V, E, t;
	vector<int>cost;
	vector<bool>vzt;
	vector<vector<pair<int,int>>>adj;//to,val
	void init(int n,int dflt) {//dflt!=0
		t = 1;
		V = n;
		adj = vector<vector<pair<int,int>>>(V + 1);
		cost = vector<int>(V + 1, dflt);
		vzt = vector<bool>(V + 1, false);
		return;
	}

	void Dijkstra(int s){
		priority_queue<pair<int,int>>pq;
		pq.push({s,0});
		cost[s]=0;
		while(!pq.empty()){
			auto now=pq.top().first,ncos=pq.top().second;
			pq.pop();
			for(int i=0;i<adj[now].size();i++){
				if(cost[adj[now][i].first]>cost[now]+adj[now][i].second){
					cost[adj[now][i].first]=cost[now]+adj[now][i].second;
					pq.push({ adj[now][i].first,cost[adj[now][i].first] });
				}
			}
		}
		return;
	}
};

int n;
Graph G;

int main() {
	cin >> n;
	G.init(n,(1<<30));
	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;
			G.adj[u].push_back({v,c});
		}
	}
	G.Dijkstra(0);
	for(int i=0;i<n;i++){
		cout<<i<<" "<<G.cost[i]<<endl;
	}
	return 0;
}

C++: #include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<sstream>
#include<cmath>
#include<numeric>
#include<map>
#include<stack>
#include<queue>
using namespace std;
int inf = 1000000000;

class node{
public:
  int to;
  int from;
  int cost;
};

int main(void) {

  int n; scanf("%d", &n);
  vector<node> v;
  for(int i=0; i<n; i++){
    int u, k;
    scanf("%d %d", &u, &k);
    for(int j=0; j<k; j++){
      int vv, c;
      scanf("%d %d", &vv, &c);
      node t;
      t.from = u;
      t.to = vv;
      t.cost = c;
      v.push_back(t);
    }
  }

  vector<int> dist(n, inf);
  vector<bool> vis(n, false);

  priority_queue< pair<int, int> > pq;
  pq.push(make_pair(0, 0));
  dist[0] = 0;
  vis[0] = true;
  while( !pq.empty() ){
    pair<int, int> pos = pq.top();
    pq.pop();

    for(int i=0; i<v.size(); i++){
      if( pos.second != v[i].from ) continue;
      // if( vis[ v[i].to ] ) continue;
      if( dist[v[i].to] < dist[v[i].from] + v[i].cost ) continue;

      dist[v[i].to] = min(dist[v[i].to], dist[v[i].from] + v[i].cost);
      pq.push(make_pair(dist[v[i].to], v[i].to));
      vis[v[i].to] = true;
    }

  }

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

  return 0;
}

// EOF

C++: #include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#define D_MAX 1 << 21
#define N_MAX 10000
using namespace std;

int dis[N_MAX];
int n;

struct node {
  int to;
  int cost;
  node(int to,int cost) {
    this->to = to;
    this->cost = cost;
  }
};

void dijkstra(int st,vector< vector<node*> > &nodes) {
  for(int i=0;i<n;i++) dis[i] = D_MAX;
  dis[st] = 0;
  bool visited[n]; for(int i=0;i<n;i++) visited[i] = false;
  vector<int> vertexes;
  visited[st] = true;
  vertexes.push_back(st);
  int pre_cost = 0;
  while(vertexes.size() < n) {
    // update distance list
    int v = vertexes[vertexes.size()-1];
    for(int j=0;j<nodes[v].size();j++) {
      int u = nodes[v][j]->to;
      if(visited[u]) continue;
      int cost = nodes[v][j]->cost + pre_cost;
      dis[u] = min(dis[u],cost);
    }
    // find vertex which has smallest distance.
    int next_v;
    int minimum = D_MAX;
    for(int i=0;i<n;i++) {
      if(visited[i]) continue;
      if(dis[i] < minimum) {
        minimum = dis[i];
        next_v = i;
      }
    }
    visited[next_v] = true;
    vertexes.push_back(next_v);
    pre_cost = dis[next_v];
  }
}

int main() {
  scanf("%d",&n);
  int u,k,v,c;
  vector<vector< node*> > nodes;
  nodes.resize(n);
  for(int i=0;i<n;i++) {
    scanf("%d %d",&u,&k);
    for(int j=0;j<k;j++) {
      scanf("%d %d",&v,&c);
      nodes[u].push_back(new node(v,c));
    }
  }

  // check
  /*
  for(int i=0;i<nodes.size();i++) {
    for(int j=0;j<nodes[i].size();j++) {
      printf("%2d :%2d %2d\n",i,nodes[i][j]->to,nodes[i][j]->cost);
    }
  }
  */

  dijkstra(0,nodes);
  for(int i=0;i<n;i++) {
    printf("%d %d\n",i,dis[i]);
  }
}