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 <fstream>
#include <stdio.h>
#include <algorithm>
#include <queue>

using namespace std;

static const int MAX = 1000000;
static const int INFTY = (1 << 21);

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

void dijkstr(){
    int d[MAX];
    priority_queue<pair<int, int>,vector<pair<int, int> >, greater<pair<int, int> > > pq;
    fill(d, d+n, INFTY);
    
    pq.push(make_pair(0, 0));
    
    while(!pq.empty()){
        pair<int, int> f = pq.top(); pq.pop();
        int u = f.second;
        if(d[u] != INFTY) continue;
        d[u] = f.first;
        for(int i=0; i<M[u].size(); i++){
            pq.push(make_pair(f.first+M[u][i].first, M[u][i].second));
        }
    }
    
    for(int i=0; i<n; i++)
        cout << i << " " << d[i] << endl;
    
}


int main(int argc, const char * argv[]) {
    // input from txt
    /////////
    //write//
    /////////
    
    cin >> n;
    int u, k ,v, c;
    
    for(int i=0; i<n; i++){
        cin >> u >> k;
        for(int j=0; j<k; j++){
            cin >> v >> c;
            M[u].push_back(make_pair(c, v));
        }
    }
    
    dijkstr();
    
    return 0;
}

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

#define MAX 10000
#define INF (1<<29)

struct Edge{
  int c, to;
};

struct state{
  int node, c;
  bool operator <(const state &b)const{
    return c > b.c;
  }
};

int n;
int d[MAX+1];
vector<Edge> G[MAX+1];
priority_queue<state> q;

void dijkstra(){

  fill(d,d+MAX+1,INF);
  q.push((state){0,0});
  d[0] = 0;

  while(!q.empty()){

    state info;
    info = q.top();
    q.pop();

    for(int i = 0; i < G[info.node].size(); i++){
      if(d[G[info.node][i].to] > G[info.node][i].c + d[info.node]){
        d[G[info.node][i].to] = G[info.node][i].c + d[info.node];
        q.push((state){G[info.node][i].to,d[info.node]});
      }
    }
  }

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



}

int main(){

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

  dijkstra();

}

C++: #include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<vector>

#define INF 2000000001
#define MAX 10001
#define NIL -1

using namespace std;

typedef struct {
    int toid;
    int far;
} PATH;

vector<PATH> D[MAX];
int N;
int Dist[MAX];

void dijkstra(){//0??????????????¢??????????????£?????????
    
    bool complete[MAX];
    vector<int> S;
    
    for (int i = 0; i < N; i++) {
        complete[i] = false;
        Dist[i] = INF;
    }
 
    //???????¨????
    Dist[0] = 0;
    S.push_back(0);
    int u=0,minf;
    complete[u] = true;
    
    while (1) {
        if (S.size() == N) break;
        
        //????????????
        for (int j = 0; j < D[u].size(); j++) {
            if (!complete[D[u][j].toid] && Dist[u] + D[u][j].far < Dist[D[u][j].toid]) {
                Dist[D[u][j].toid] = Dist[u] + D[u][j].far;
            }
        }
        
        
        
        u = NIL;
        minf = INF;
        
        //?¨??????´??°
//        for (int i = 0; i < S.size(); i++) {
//            
//            for (int j = 0; j < D[S[i]].size(); j++) {
//                if (Dist[D[S[i]][j].toid] < minf && !complete[D[S[i]][j].toid]) {
//                    minf = Dist[D[S[i]][j].toid];
//                    u = D[S[i]][j].toid;
//                }
//            }
//            
//        }
        
        for (int i = 0; i < N; i++) {
            if (!complete[i] && Dist[i] < minf) {
                minf = Dist[i];
                u = i;
            }
        }
        
        S.push_back(u);
        complete[u] = true;
        //u = S.size()-1;//????????§u????????§??¨????????????????????????
    }
}

int main(){
    cin >> N;
    for (int i = 0; i < N; i++) {
        int bb1,bb2;
        cin >> bb1 >> bb2;
        for (int j = 0; j < bb2; j++) {
            PATH bb3;
            cin >> bb3.toid >> bb3.far;
            D[i].push_back(bb3);
        }
    }
    
    dijkstra();
    
    for (int i = 0; i < N; i++) {
        printf("%d %d\n",i,Dist[i]);
    }
    
    return 0;
}

C++: #include <bits/stdc++.h> 
using namespace std; 
typedef long long ll; 
#define FOR(I,A,B) for(ll I = (A); I < (B); ++I) 
const ll INF=1e9+7; 
const ll N = 101; 
  
 
class dijkstra{ 
//0indexed 
public: 
	int v,startv; 
	vector<int> d; 
	vector<vector<pair<int,int> > >e; 

void initsize(int n0){ 
	d.resize(n0); 
	for(int i=0;i<n0;i++)d[i]=INT_MAX; 
	vector<pair<int,int> > ep; 
	for(int i=0;i<n0;i++)e.push_back(ep); 
	v=n0; 
}  
 
void initstart(int s){ 
	startv=s;
	d[s]=0;
}
 
void make_edge(int x,int y,int cost){ 
	e[x].push_back(make_pair(y,cost)); 
	e[y].push_back(make_pair(x,cost)); 
}
 
void make_edgedir(int x,int y,int cost){ 
	e[x].push_back(make_pair(y,cost)); 
}
 
void calcdistance(){ 
	// <-cost,x> 
	//cost startv->x 
	priority_queue<pair<int,int> > q; 
	pair<int,int> p; 
	vector<bool> did; 
	for(int i=0;i<v;i++)did.push_back(false); 
	did[startv]=true; 
	for(int i=0;i<e[startv].size();i++){ 
		p.first=-e[startv][i].second; 
		p.second=e[startv][i].first; 
		q.push(p); 
	}
 
	while(q.size()!=0){ 
		pair<int,int> p; 
		p=q.top(); 
		q.pop(); 
		int x,costsx; 
		x=p.second; 
		costsx=-p.first; 
		if(did[x]==true)continue; 
		did[x]=true; 
		d[x]=costsx; 
 
		for(int i=0;i<e[x].size();i++){ 
			p.first=-(d[x]+e[x][i].second); 
			p.second=e[x][i].first; 
			if(did[p.second]==false)q.push(p); 
		}
	}
}
};

int main(){ 
	dijkstra di;
	int n;
	cin>>n;
	di.initsize(n);
	di.initstart(0);
	FOR(i,0,n){
		int u,k;
		cin>>u>>k;
		FOR(j,0,k){
			int x,co;
			cin>>x>>co;
			di.make_edgedir(u,x,co);
		}
	}
	di.calcdistance();
	FOR(i,0,n){
		cout<<i<<" "<<di.d[i]<<endl;
	}
	return 0; 
}