public int dijkstra(int s, int t, int c) {
			for (int i = 0; i < cost.length; i++)
				Arrays.fill(d[i], INF);
			PriorityQueue<Edge> q = new PriorityQueue<Edge>();
			q.add(new Edge(s, 0, 0));
			d[s][0] = 0;
			while (!q.isEmpty()) {
				Edge u = q.poll();
				if(u.id == t)
					return u.w;
				if (d[u.id][u.g] < u.w)
					continue;
				if (u.g < c && d[u.id][u.g + 1] > u.w + cost[u.id]) {
					d[u.id][u.g + 1] = u.w + cost[u.id];
					q.add(new Edge(u.id, d[u.id][u.g + 1], u.g + 1));
				}
				for (int i = 0; i < adj[u.id].size(); i++) {
					Edge v = adj[u.id].get(i);
					if (u.g >= v.w && d[v.id][u.g - v.w] > u.w) {
						d[v.id][u.g - v.w] = u.w;
						q.add(new Edge(v.id, d[v.id][u.g - v.w], u.g - v.w));
					}
				}
			}
			return INF;
		}